activemq-artemis/examples/jms/clustered-topic
jbertram e6a3d3a0c5 ACTIVEMQ6-14 Replace JNDI server with client impl 2014-12-05 09:27:52 -06:00
..
src/main ACTIVEMQ6-14 Replace JNDI server with client impl 2014-12-05 09:27:52 -06:00
pom.xml ACTIVEMQ6-14 Replace JNDI server with client impl 2014-12-05 09:27:52 -06:00
readme.html Remove references to HornetQ in doc and Comments 2014-11-19 15:15:35 +00:00

readme.html

<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>&lt;cluster-connection name="my-cluster"&gt;
        &lt;address&gt;jms&lt;/address&gt;
        &lt;retry-interval&gt;500&lt;/retry-interval&gt;
        &lt;use-duplicate-detection&gt;true&lt;/use-duplicate-detection&gt;
        &lt;forward-when-no-consumers&gt;true&lt;/forward-when-no-consumers&gt;
        &lt;max-hops&gt;1&lt;/max-hops&gt;
        &lt;discovery-group-ref discovery-group-name="my-discovery-group"/&gt;
     &lt;/cluster-connection&gt;
     </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>