package net.lr.karaf.jms.service;
import java.util.Enumeration;
import java.util.List;
import javax.annotation.Resource;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.InvalidSelectorException;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.QueueBrowser;
import javax.jms.Session;
import net.lr.karaf.jms.template.JmsTemplate;
import net.lr.karaf.jms.template.SessionExecutor;
import net.lr.karaf.jms.template.VoidSessionExecutor;
@Resource
public class JmsService {
private Connection connection;
private JmsTemplate jmsTemplate = new JmsTemplate();
private ExtJmsService extJmsService;
private ExtJmsServiceFactory extJmsServiceFactory;
private ConnectionFactory connectionFactory;
public void setConnection(Connection connection) {
if (this.connection != null) {
try {
this.connection.close();
} catch (JMSException e) {
// Ignore
}
}
this.connection = connection;
this.jmsTemplate = new JmsTemplate();
this.jmsTemplate.setConnection(connection);
this.extJmsService = extJmsServiceFactory.create(this.connection);
}
public void assertConnection() {
if (this.connection == null) {
throw new RuntimeException("No JMS connection selected");
}
}
@SuppressWarnings("unchecked")
public Enumeration<JmsMessage> browseQueue(final String queueName, final String selector) {
assertConnection();
return jmsTemplate.doInSessionNoClose(new SessionExecutor<Enumeration<JmsMessage>>() {
public Enumeration<JmsMessage> execute(Session session) throws JMSException {
try {
QueueBrowser browser = session.createBrowser(session.createQueue(queueName), selector);
return new JmsMessageIterator(session, browser.getEnumeration());
} catch (InvalidSelectorException e) {
throw new RuntimeException("Invalid selector: " + e.getMessage(), e);
}
}
});
}
public void send(final String queueName, final String body, final String replyTo) {
assertConnection();
jmsTemplate.doInSession(new VoidSessionExecutor() {
public void execute(Session session) throws JMSException {
Message message = session.createTextMessage(body);
if (replyTo != null) {
message.setJMSReplyTo(session.createQueue(replyTo));
}
jmsTemplate.send(session, session.createQueue(queueName), message);
}
});
}
public Integer deleteMessages(final String queueName, final String selector) {
assertConnection();
return jmsTemplate.doInSession(new SessionExecutor<Integer>() {
public Integer execute(Session session) throws JMSException {
MessageConsumer consumer = session.createConsumer(session.createQueue(queueName), selector);
Message message;
int count = 0;
do {
message = consumer.receiveNoWait();
if (message != null) {
count ++;
}
} while (message != null);
return count;
}
});
}
public int deleteMessage(final String queueName, final String messageId) {
assertConnection();
String selector = String.format("JMSMessageID = '%s'", messageId);
return deleteMessages(queueName, selector);
}
public List<String> listQueues() {
assertConnection();
return extJmsService.listQueues();
}
public List<String> listTopics() throws JMSException {
assertConnection();
return extJmsService.listTopics();
}
public void deleteQueue(final String queueName) {
assertConnection();
}
public QueueInfo getQueueInfo(String queueName) {
assertConnection();
return extJmsService.getQueueInfo(queueName);
}
public void setExtJmsServiceFactory(ExtJmsServiceFactory extJmsServiceFactory) {
this.extJmsServiceFactory = extJmsServiceFactory;
}
public void setConnectionFactory(ConnectionFactory cf) {
try {
this.connectionFactory = cf;
Connection con = cf.createConnection();
con.start();
setConnection(con);
} catch (JMSException e) {
throw new RuntimeException(e.getMessage(), e);
}
}
public ConnectionFactory getConnectionFactory() {
return connectionFactory;
}
}