mirror of
https://github.com/apache/activemq-artemis.git
synced 2025-02-08 02:59:14 +00:00
<html> <head> <title>ActiveMQ JMS Clustered Topic Example</title> <link rel="stylesheet" type="text/css" href="../common/common.css" /> <link rel="stylesheet" type="text/css" href="../common/prettify.css" /> <script type="text/javascript" src="../common/prettify.js"></script> </head> <body onload="prettyPrint()"> <h1>JMS Clustered Topic Example</h1> <p>This example demonstrates a JMS Topic deployed on two different nodes. The two nodes are configured to form a cluster.</p> <p>We then create a subscriber on the topic on each node, and we create a producer on only one of the nodes.</p> <p>We then send some messages via the producer, and we verify that <b>both</b> subscribers receive all the sent messages.</p> <p>A JMS Topic is an example of <b>publish-subscribe</b> messaging where all subscribers receive all the messages sent to the topic (assuming they have no message selectors).</p> <p>This example uses JNDI to lookup the JMS Queue and ConnectionFactory objects. If you prefer not to use JNDI, these could be instantiated directly. <p>Here's the relevant snippet from the server configuration, which tells the server to form a cluster between the two nodes and to load balance the messages between the nodes.</p> <pre class="prettyprint"> <code><cluster-connection name="my-cluster"> <address>jms</address> <retry-interval>500</retry-interval> <use-duplicate-detection>true</use-duplicate-detection> <forward-when-no-consumers>true</forward-when-no-consumers> <max-hops>1</max-hops> <discovery-group-ref discovery-group-name="my-discovery-group"/> </cluster-connection> </code> </pre> <p>For more information on ActiveMQ load balancing, and clustering in general, please see the clustering section of the user manual.</p> <h2>Example step-by-step</h2> <p><i>To run the example, simply type <code>mvn verify</code> from this directory</i></p> <ol> <li> Get an initial context for looking up JNDI from server 0.</li> <pre class="prettyprint"> <code> ic0 = getContext(0); </code> </pre> <li>Look-up the JMS Topic object from JNDI</li> <pre class="prettyprint"> <code>Topic topic = (Topic)ic0.lookup("/topic/exampleTopic");</code> </pre> <li>Look-up a JMS Connection Factory object from JNDI on server 0</li> <pre class="prettyprint"> <code>ConnectionFactory cf0 = (ConnectionFactory)ic0.lookup("/ConnectionFactory");</code> </pre> <li>Get an initial context for looking up JNDI from server 1.</li> <pre class="prettyprint"> <code>ic1 = getContext(1);</code> </pre> <li>Look-up a JMS Connection Factory object from JNDI on server 1</li> <pre class="prettyprint"> <code>ConnectionFactory cf1 = (ConnectionFactory)ic1.lookup("/ConnectionFactory"); </code> </pre> <li>We create a JMS Connection connection0 which is a connection to server 0</li> <pre class="prettyprint"> <code> connection0 = cf0.createConnection(); </code> </pre> <li>We create a JMS Connection connection1 which is a connection to server 1</li> <pre class="prettyprint"> <code> connection1 = cf1.createConnection(); </code> </pre> <li>We create a JMS Session on server 0</li> <pre class="prettyprint"> <code> Session session0 = connection0.createSession(false, Session.AUTO_ACKNOWLEDGE); </code> </pre> <li>We create a JMS Session on server 1</li> <pre class="prettyprint"> <code> Session session1 = connection1.createSession(false, Session.AUTO_ACKNOWLEDGE); </code> </pre> <li>We start the connections to ensure delivery occurs on them</li> <pre class="prettyprint"> <code> connection0.start(); connection1.start(); </code> </pre> <li>We create JMS MessageConsumer (Topic subscriber) objects on server 0 and server 1</li> <pre class="prettyprint"> <code> MessageConsumer consumer0 = session0.createConsumer(topic); MessageConsumer consumer1 = session1.createConsumer(topic); </code> </pre> <li>We create a JMS MessageProducer object on server 0.</li> <pre class="prettyprint"> <code> MessageProducer producer = session0.createProducer(topic);</code> </pre> <li>We send some messages to server 0.</li> <pre class="prettyprint"> <code> final int numMessages = 10; for (int i = 0; i < numMessages; i++) { TextMessage message = session0.createTextMessage("This is text message " + i); producer.send(message); System.out.println("Sent message: " + message.getText()); } </code> </pre> <li> We now consume those messages on <b>both</b> server 0 and server 1. We note that all messages have been consumed by <b>both</b> consumers. JMS Topics implement <b>publish-subscribe</b> messaging where all consumers get a copy of all messages. <pre class="prettyprint"> <code> for (int i = 0; i < numMessages; i ++) { TextMessage message0 = (TextMessage)consumer0.receive(5000); System.out.println("Got message: " + message0.getText() + " from node 0"); TextMessage message1 = (TextMessage)consumer1.receive(5000); System.out.println("Got message: " + message1.getText() + " from node 1"); } </code> </pre> <li>And finally (no pun intended), <b>always</b> remember to close your JMS resources after use, in a <code>finally</code> block. Closing a JMS connection will automatically close all of its sessions, consumers, producer and browser objects</li> <pre class="prettyprint"> <code> finally { if (connection0 != null) { connection0.close(); } if (connection1 != null) { connection1.close(); } } </code> </pre> </ol> </body> </html>