package org.yajul.jms; import javax.jms.*; import java.util.ArrayList; import java.util.List; /** * IoC template for working with multiple JMS destinations. * Automagically cleans up JMS connections, sessions, consumers * and producers. * <br> * User: josh * Date: Mar 3, 2009 * Time: 3:30:07 PM */ public class JmsTemplate implements JmsContext { private ConnectionFactoryProvider connectionFactoryReference; private List<Connection> connections = new ArrayList<Connection>(); private boolean transacted; private int acknowledgeMode = javax.jms.Session.AUTO_ACKNOWLEDGE; private boolean noLocal; private List<Session> sessions = new ArrayList<Session>(); private List<MessageConsumer> consumers = new ArrayList<MessageConsumer>(); private List<MessageProducer> producers = new ArrayList<MessageProducer>(); public boolean isTransacted() { return transacted; } public void setTransacted(boolean transacted) { this.transacted = transacted; } public int getAcknowledgeMode() { return acknowledgeMode; } public void setAcknowledgeMode(int acknowledgeMode) { this.acknowledgeMode = acknowledgeMode; } public boolean isNoLocal() { return noLocal; } public void setNoLocal(boolean noLocal) { this.noLocal = noLocal; } public JmsTemplate(ConnectionFactoryProvider connectionFactoryReference) { this.connectionFactoryReference = connectionFactoryReference; } public TopicConnection createTopicConnection() throws JMSException { TopicConnection con = connectionFactoryReference.getTopicConnectionFactory().createTopicConnection(); connections.add(con); return con; } public TopicSession createTopicSession(TopicConnection con) throws JMSException { TopicSession session = con.createTopicSession(isTransacted(), getAcknowledgeMode()); sessions.add(session); return session; } public TopicSubscriber createSubscriber(TopicSession session, Topic topic, String selector) throws JMSException { TopicSubscriber subscriber = session.createSubscriber(topic, selector, isNoLocal()); consumers.add(subscriber); return subscriber; } public TopicPublisher createPublisher(TopicSession session, Topic topic) throws JMSException { TopicPublisher publisher = session.createPublisher(topic); producers.add(publisher); return publisher; } public <T> T doAction(JmsAction<T> action) throws JMSException { T rv = null; try { rv = action.run(this); } finally { cleanup(); } return rv; } private void cleanup() { // Clean up all the resources that were used during the transaction. // Stop the connections if there are consumers. if (!consumers.isEmpty()) { for (Connection connection : connections) { JmsHelper.stop(connection); } } for (MessageProducer producer : producers) { JmsHelper.close(producer); } producers.clear(); for (MessageConsumer consumer : consumers) { JmsHelper.close(consumer); } consumers.clear(); for (Session session : sessions) { JmsHelper.close(session); } sessions.clear(); for (Connection connection : connections) { JmsHelper.close(connection); } connections.clear(); } public interface JmsAction<T> { T run(JmsContext ctx) throws JMSException; } }