package org.apache.activemq.recipes; import java.util.concurrent.CountDownLatch; import javax.jms.Connection; import javax.jms.Destination; import javax.jms.MessageConsumer; import javax.jms.MessageProducer; import javax.jms.Queue; import javax.jms.Session; import org.apache.activemq.ActiveMQConnectionFactory; import org.apache.activemq.broker.BrokerService; public class VirtualDestinationApp { private final String connectionUri = "tcp://localhost:61616"; private ActiveMQConnectionFactory connectionFactory; private BrokerService broker; private Connection receiverConnection; private Session receiverSession; private final CountDownLatch done = new CountDownLatch(1000); public void before() throws Exception { broker = new BrokerService(); broker.setPersistent(false); broker.addConnector("tcp://0.0.0.0:61616"); broker.start(); connectionFactory = new ActiveMQConnectionFactory(connectionUri); receiverConnection = connectionFactory.createConnection(); receiverSession = receiverConnection.createSession(false, Session.AUTO_ACKNOWLEDGE); receiverConnection.start(); } private void sendMessages() throws Exception { Connection connection = connectionFactory.createConnection(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); Destination destination = session.createTopic("VirtualTopic.Foo"); MessageProducer producer = session.createProducer(destination); for (int i = 0; i < 1000; ++i) { producer.send(session.createMessage()); } connection.close(); } public void after() throws Exception { try { receiverConnection.close(); } finally { broker.stop(); } } public void run() throws Exception { Queue queueA = receiverSession.createQueue("Consumer.A.VirtualTopic.Foo"); VirtualMessageListener listenerA1 = new VirtualMessageListener(done); MessageConsumer consumerA1 = receiverSession.createConsumer(queueA); consumerA1.setMessageListener(listenerA1); VirtualMessageListener listenerA2 = new VirtualMessageListener(done); MessageConsumer consumerA2 = receiverSession.createConsumer(queueA); consumerA2.setMessageListener(listenerA2); Queue queueB = receiverSession.createQueue("Consumer.B.VirtualTopic.Foo"); VirtualMessageListener listenerB = new VirtualMessageListener(done); MessageConsumer consumerB = receiverSession.createConsumer(queueB); consumerB.setMessageListener(listenerB); sendMessages(); done.await(); System.out.println("Queue A Consumer 1 processed " + listenerA1.getNumReceived() + " Messages"); System.out.println("Queue A Consumer 2 processed " + listenerA1.getNumReceived() + " Messages"); System.out.println("Queue B Consumer processed " + listenerB.getNumReceived() + " Messages"); } public static void main(String[] args) { VirtualDestinationApp example = new VirtualDestinationApp(); System.out.print("\n\n\n"); System.out.println("Starting Virtual Destination example now..."); try { example.before(); example.run(); example.after(); } catch (Exception e) { System.out.println("Caught an exception during the example: " + e.getMessage()); } System.out.println("Finished running the Virtual Destination example."); System.out.print("\n\n\n"); } }