<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>