mirror of
https://github.com/apache/activemq-artemis.git
synced 2025-02-08 02:59:14 +00:00
<html> <head> <title>HornetQ JMS Clustered Grouping Example</title> <link rel="stylesheet" type="text/css" href="../common/common.css"> </head> <body> <h1>JMS Clustered Grouping Example</h1> <p>This example demonstrates how to ensure strict ordering across a cluster using clustered message grouping</p> <p>We create 3 nodes each with a grouping message handler, one with a Local handler and 2 with a Remote handler.</p> <p>The local handler acts as an arbitrator for the 2 remote handlers, holding the information on routes and communicating the routing info with the remote handlers on the other 2 nodes</p> <p>We then send some messages to each node with the same group id set and ensure the same consumer receives all of them</p> <p>Here's the relevant snippet from the server configuration that has the local handler</p> <pre> <code> <cluster-connections> <cluster-connection name="my-cluster"> <address>jms</address> <connector-ref>netty-connector</connector-ref> <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> </cluster-connections> <grouping-handler name="my-grouping-handler"> <type>LOCAL</type> <address>jms</address> <timeout>5000</timeout> </grouping-handler> </code> </pre> <p>Here's the relevant snippet from the server configuration that has the remote handlers</p> <pre> <code> <cluster-connections> <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> </cluster-connections> <grouping-handler name="my-grouping-handler"> <type>REMOTE</type> <address>jms</address> <timeout>5000</timeout> </grouping-handler> </code> </pre> <p>For more information on HornetQ clustering and grouping see the clustering and grouping 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 Queue object from JNDI</li> <pre class="prettyprint"> <code>Queue queue = (Queue)ic0.lookup("/queue/exampleQueue");</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>Get an initial context for looking up JNDI from server 2.</li> <pre class="prettyprint"> <code>ic2 = getContext(2);</code> </pre> <li>Look-up a JMS Connection Factory object from JNDI on server 2</li> <pre class="prettyprint"> <code>ConnectionFactory cf2 = (ConnectionFactory)ic2.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 connection0 which is a connection to server 1</li> <pre class="prettyprint"> <code>connection1 = cf1.createConnection();</code> </pre> <li>We create a JMS Connection connection0 which is a connection to server 2</li> <pre class="prettyprint"> <code>connection2 = cf2.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 create a JMS Session on server 2</li> <pre class="prettyprint"> <code>Session session2 = connection2.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(); connection2.start();</code> </pre> <li>We create JMS MessageConsumer objects on server 0</li> <pre class="prettyprint"> <code>MessageConsumer consumer = session0.createConsumer(queue);</code> </pre> <li>We create a JMS MessageProducer object on server 0, 1 and 2</li> <pre class="prettyprint"> <code> MessageProducer producer0 = session0.createProducer(queue); MessageProducer producer1 = session1.createProducer(queue); MessageProducer producer2 = session2.createProducer(queue);</code> </pre> <li>We send some messages to server 0, 1 and 2 with the same groupid set</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); message.setStringProperty(HornetQMessage.JMSXGROUPID, "Group-0"); producer0.send(message); System.out.println("Sent messages: " + message.getText() + " to node 0"); } for (int i = 0; i < numMessages; i++) { TextMessage message = session1.createTextMessage("This is text message " + (i + 10)); message.setStringProperty(HornetQMessage.JMSXGROUPID, "Group-0"); producer1.send(message); System.out.println("Sent messages: " + message.getText() + " to node 1"); } for (int i = 0; i < numMessages; i++) { TextMessage message = session2.createTextMessage("This is text message " + (i + 20)); message.setStringProperty(HornetQMessage.JMSXGROUPID, "Group-0"); producer2.send(message); System.out.println("Sent messages: " + message.getText() + " to node 2"); } </code> </pre> <li>We now consume those messages from server 0. We note the messages have all been sent to the same consumer on the same node</li> <pre class="prettyprint"> <code> for (int i = 0; i < numMessages * 3; i++) { TextMessage message0 = (TextMessage)consumer.receive(5000); System.out.println("Got message: " + message0.getText() + " from node 0"); } </code> </pre> <li>Finally, Be sure to close our resources!</li> <pre class="prettyprint"> <code> if (connection0 != null) { connection0.close(); } if (connection1 != null) { connection1.close(); } if (connection2 != null) { connection2.close(); } if (ic0 != null) { ic0.close(); } if (ic1 != null) { ic1.close(); } if (ic2 != null) { ic2.close(); }</code> </pre> </ol> </body> </html>