package eu.leads.processor; import javax.jms.*; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import java.util.HashMap; import java.util.Map; import java.util.Properties; /** * Created with IntelliJ IDEA. * User: vagvaz * Date: 9/7/13 * Time: 6:48 PM * . */ //CommunicationComponent is used from modules to exchange JMS messages either using a queue or a topic //We use apache ActiveMQ as a JMS Broker public class CommunicationComponent { private String identifier; private Map<String, MessageProducer> topicProducers; private Map<String, MessageConsumer> topicConsumers; private Map<String, MessageProducer> queueProducers; private Map<String, MessageConsumer> queueConsumers; private Map<String, Topic> consumerTopics; private Map<String, Topic> producerTopics; private Map<String, Queue> consumerQueues; private Map<String, Queue> producerQueues; private Topic control; private String url; private Session session; private Connection connection; public CommunicationComponent(String url, String identifier) throws JMSException, NamingException { this.identifier = identifier; topicProducers = new HashMap<String, MessageProducer>(); topicConsumers = new HashMap<String, MessageConsumer>(); queueProducers = new HashMap<String, MessageProducer>(); queueConsumers = new HashMap<String, MessageConsumer>(); consumerTopics = new HashMap<String, Topic>(); producerTopics = new HashMap<String, Topic>(); consumerQueues = new HashMap<String, Queue>(); producerQueues = new HashMap<String, Queue>(); Properties props = new Properties(); props.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.activemq.jndi.ActiveMQInitialContextFactory"); props.setProperty(Context.PROVIDER_URL, url); javax.naming.Context ctx = new InitialContext(props); ConnectionFactory connectionFactory = (ConnectionFactory) ctx.lookup("ConnectionFactory"); connection = connectionFactory.createConnection(); session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); control = session.createTopic("leads.processor.control"); subscribeToTopic(control); MessageProducer defaultProducer = session.createProducer(null); queueProducers.put("default", defaultProducer); } private void subscribeToTopic(Topic topic) throws JMSException { if (!consumerTopics.containsKey(topic.getTopicName())) { MessageConsumer newconsumer = session.createConsumer(topic); consumerTopics.put(topic.getTopicName(), topic); topicConsumers.put(topic.getTopicName(), newconsumer); } } public void subscribeToTopic(String topic) throws JMSException { if (!consumerTopics.containsKey(topic)) { Topic newtopic = session.createTopic(topic); MessageConsumer newconsumer = session.createConsumer(newtopic); consumerTopics.put(topic, newtopic); topicConsumers.put(topic, newconsumer); } } public void unsubribeFromTopic(String topic) throws JMSException { if (consumerTopics.containsKey(topic)) { session.unsubscribe(topic); consumerTopics.remove(topic); topicConsumers.remove(topic); } } public void subscribeToQueue(String queue) throws JMSException { if (!consumerQueues.containsKey(queue)) { Queue newqueue = session.createQueue(queue); MessageConsumer newconsumer = session.createConsumer(newqueue); consumerQueues.put(queue, newqueue); queueConsumers.put(queue, newconsumer); } } public void subscribeToQueue(Destination destination) throws JMSException { if (!consumerQueues.containsKey(destination.toString())) { MessageConsumer newconsumer = session.createConsumer(destination); consumerQueues.put(destination.toString(), (Queue) destination); queueConsumers.put(destination.toString(), newconsumer); } } public void unsubscribeFromQueue(String queue) throws JMSException { if (consumerQueues.containsKey(queue)) { session.unsubscribe(queue); consumerQueues.remove(queue); queueConsumers.remove(queue); } } public void createTopicPublisher(String topic) throws JMSException { Topic newtopic = session.createTopic(topic); MessageProducer newproducer = session.createProducer(newtopic); producerTopics.put(topic, newtopic); topicProducers.put(topic, newproducer); } public void createQueuePublisher(String queue) throws JMSException { Queue newqueue = session.createQueue(queue); MessageProducer newproducer = session.createProducer(newqueue); producerQueues.put(queue, newqueue); queueProducers.put(queue, newproducer); } public void publishToTopic(Message message, String topic) throws JMSException { MessageProducer producer = topicProducers.get(topic); if (producer != null) producer.send(message); } public void publishToQueue(Message message, String queue) throws JMSException { MessageProducer producer = queueProducers.get(queue); if (producer != null) producer.send(message); } public void removeTopicPublisher(String topic) { if (producerTopics.containsKey(topic)) { producerTopics.remove(topic); topicProducers.remove(topic); } } public void removeQueuePublisher(String queue) { if (producerQueues.containsKey(queue)) { producerQueues.remove(queue); queueProducers.remove(queue); } } public void setTopicMessageListener(MessageListener listener, String queue) throws JMSException { if (topicConsumers.containsKey(queue)) { MessageConsumer consumer = topicConsumers.get(queue); consumer.setMessageListener(listener); } } public void setTopicMessageListener(MessageListener listener) throws JMSException { for (java.util.Iterator<MessageConsumer> iterator = topicConsumers.values().iterator(); iterator.hasNext(); ) { MessageConsumer next = iterator.next(); next.setMessageListener(listener); } } public void setQueueMessageListener(MessageListener listener, String queue) throws JMSException { if (queueConsumers.containsKey(queue)) { MessageConsumer consumer = queueConsumers.get(queue); consumer.setMessageListener(listener); } } public void setQueueMessageListener(MessageListener listener) throws JMSException { for (java.util.Iterator<MessageConsumer> iterator = queueConsumers.values().iterator(); iterator.hasNext(); ) { MessageConsumer next = iterator.next(); next.setMessageListener(listener); } } public String getIdentifier() { return identifier; } public void setIdentifier(String identifier) { this.identifier = identifier; } public Map<String, MessageProducer> getTopicProducers() { return topicProducers; } public void setTopicProducers(Map<String, MessageProducer> topicProducers) { this.topicProducers = topicProducers; } public Map<String, MessageConsumer> getTopicConsumers() { return topicConsumers; } public void setTopicConsumers(Map<String, MessageConsumer> topicConsumers) { this.topicConsumers = topicConsumers; } public Map<String, MessageProducer> getQueueProducers() { return queueProducers; } public void setQueueProducers(Map<String, MessageProducer> queueProducers) { this.queueProducers = queueProducers; } public Map<String, MessageConsumer> getQueueConsumers() { return queueConsumers; } public void setQueueConsumers(Map<String, MessageConsumer> queueConsumers) { this.queueConsumers = queueConsumers; } public Map<String, Topic> getConsumerTopics() { return consumerTopics; } public void setConsumerTopics(Map<String, Topic> consumerTopics) { this.consumerTopics = consumerTopics; } public Map<String, Topic> getProducerTopics() { return producerTopics; } public void setProducerTopics(Map<String, Topic> producerTopics) { this.producerTopics = producerTopics; } public Map<String, Queue> getConsumerQueues() { return consumerQueues; } public void setConsumerQueues(Map<String, Queue> consumerQueues) { this.consumerQueues = consumerQueues; } public Map<String, Queue> getProducerQueues() { return producerQueues; } public void setProducerQueues(Map<String, Queue> producerQueues) { this.producerQueues = producerQueues; } public Topic getControl() { return control; } public void setControl(Topic control) { this.control = control; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public Session getSession() { return session; } public void setSession(Session session) { this.session = session; } public Connection getConnection() { return connection; } public void setConnection(Connection connection) { this.connection = connection; } public void enable() throws JMSException { connection.start(); } public void disable() throws JMSException { session.close(); connection.close(); } public void publishToDestination(TextMessage reply, String location) { try { Destination destination = session.createQueue(location); queueProducers.get("default").send(destination, reply); } catch (JMSException e) { e.printStackTrace(); } } }