activemq-artemis/examples/javaee/jms-bridge
Clebert Suconic 89a84c6ae2 More name changes to activemq
more hornetq changes
2014-11-19 16:01:54 -05:00
..
server/standalone/configuration More name changes to activemq 2014-11-19 16:01:54 -05:00
src ACTIVEMQ6-3 renaming package names from activemq6 to activemq 2014-11-17 09:33:53 -05:00
pom.xml ACTIVEMQ6-3 renaming package names from activemq6 to activemq 2014-11-17 09:33:53 -05:00
readme.html More name changes to activemq 2014-11-19 16:01:54 -05:00

readme.html

<html>
  <head>
    <title>ActiveMQ JMS Bridge 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 Bridge Example</h1>
     
     <p>This example shows how to configure and run a JMS Bridge in WildFly.<br />
         A bridge receives messages from a <em>source</em> JMS destination and forwards them to a <em>target</em> destination.</p>
     <p>The source and target destinations can be on different servers, even from different JMS providers. For example, you can use this
         JMS Bridge to bridge a legacy JMS provider to ActiveMQ during migration.</p>
         
     <p>This example will show how to configure and run the simplest bridge:</p>
     <ul>
         <li>the source and target destinations are hosted by a single WildFly instance</li>
         <li>the bridge is run on the same WildFly instance</li>
         <li>every time a message is consumed by the bridge from the source, it is forward to the target</li>
         <li>The application client will send a message to the source and consume the "same" message from the target to
             show that the two destinations were indeed bridged.</li>
     </ul>
         
     <h3>JMS Bridge configuration</h3>

     <p>The JMS Bridge is configured in the "messaging" subsystem.<br />
     <p>The Bridge is deployed in the application server when you simply type <code>./build.sh deploy</code> (or <code>build.bat deploy</code> on windows) (it is copied to <code>${JBOSS_HOME}/server/default-with-activemq/deploy/</code>).</p>

     <h2>Example step-by-step</h2>

     <p><i>download WildFly 8.0.0.Final from <a href="http://wildfly.org/downloads/">here</a> and install.</i></p>
     <p><i>set the JBOSS_HOME property to point to the WildFly install directory</i></p>
     <p><i>type <code>mvn verify</code> from the example directory to run</i></p>
     
     <p>The example is simple: the application will send a message to the <em>source</em> queue and consume the same message
         from the <em>target</em> queue.</p>
     <p>The bridge is configured in the messaging subsystem:</p>

     <pre class="prettyprint">
             &lt;jms-bridge name="myBridge">
                 &lt;source>
                 &lt;connection-factory name="ConnectionFactory" />
                 &lt;destination name="queue/sourceQueue" />
                 &lt;/source>
                 &lt;target>
                     &lt;connection-factory name="ConnectionFactory" />
                     &lt;destination name="queue/targetQueue" />
                 &lt;/target>
                 &lt;quality-of-service>AT_MOST_ONCE&lt;/quality-of-service>
                 &lt;failure-retry-interval>1000&lt;/failure-retry-interval>
                 &lt;max-retries>7890&lt;/max-retries>
                 &lt;max-batch-size>1&lt;/max-batch-size>
                 &lt;max-batch-time>1000&lt;/max-batch-time>
             &lt;/jms-bridge>
     </pre>

     <ol>
         <li>First we need to get an initial context so we can look up the JMS resources
         </li>
         <pre class="prettyprint">
             final Properties env = new Properties();

             env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");

             env.put(Context.PROVIDER_URL, "http-remoting://localhost:8080");

             initialContext = new InitialContext(env);
         </pre>

         <li>We look up the JMS ConnectionFactory</li>
         <pre class="prettyprint">
             ConnectionFactory cf = (ConnectionFactory)initialContext.lookup("/jms/RemoteConnectionFactory");
         </pre>

         <p><em>First, we will send a message to the <em>source</em> queue</em>.</p>
         
         <li>We look up the JMS <em>source</em> queue</li>
         <pre class="prettyprint">
             Queue sourceQueue = (Queue)initialContext.lookup("jms/queues/sourceQueue");
         </pre>

         <li>We create a JMS connection, a session and a message producer for the <em>source</em> queue</li>
         <pre class="prettyprint">
             sourceConnection = cf.createConnection("guest", "password");
             Session sourceSession = sourceConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
             MessageProducer sourceProducer = sourceSession.createProducer(sourceQueue);
         </pre>

         <li>We create and send a message to the <em>source</em> queue. We also display its Message ID.</li>
         <pre class="prettyprint">
             TextMessage message = sourceSession.createTextMessage("this is a text message");
             sourceProducer.send(message);
             System.out.format("Sent message to %s: %s\n",
                               ((Queue)message.getJMSDestination()).getQueueName(),
                               message.getText());
             System.out.format("Message ID : %s\n", message.getJMSMessageID());
         </pre>

         <li>We close the <em>source</em> connection</li>
         <pre class="prettyprint">
             sourceConnection.close();
         </pre>
         
         <p><em>Now that a message has been sent to the <em>source</em> queue, we will consume a message
             from the <em>target</em> queue.<br />
             If the bridge runs correctly, it will have consumed the message from the <em>source</em> and
             resent it to the <em>target</em> so that we can consume a message from it.</em></p>
             
         <li>We look up the JMS <em>target</em> queue</li>
         <pre class="prettyprint">
             Queue targetQueue = (Queue)initialContext.lookup("jms/queues/targetQueue");
         </pre>

         <li>We create a connection, a session and a message consumer for the <em>target</em> queue</li>
         <pre class="prettyprint">
             targetConnection = cf.createConnection();
             Session targetSession = targetConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
             MessageConsumer targetConsumer = targetSession.createConsumer(targetQueue);
         </pre>

         <li>We start the JMS connection to receive messages from the <em>target</em></li>
         <pre class="prettyprint">
             targetConnection.start();
         </pre>

         <li>We receive a message from the <em>target</em> queue. It has the same content than the message sent to the <em>source</em> queue</li>
         <pre class="prettyprint">
             TextMessage messageReceived = (TextMessage)targetConsumer.receive(15000);
             System.out.format("\nReceived from %s: %s\n",
                           ((Queue)messageReceived.getJMSDestination()).getQueueName(),
                           messageReceived.getText());
             
         </pre>
         
         <li>We now display the received message ID. It is not the same than the ID of the message sent to the <em>source</em> queue.
             The message received from the <em>target</em> queue was sent by the bridge, not by the <em>source</em> message producer</li>
         <pre class="prettyprint">
             System.out.format("Message ID         : %s\n", messageReceived.getJMSMessageID());
         </pre>
         
         <li>If you need to retrieve the message ID of the message <em>sent to the source</em>, you can use the property <code>HQ_BRIDGE_MSG_ID_LIST</code></li>
         <pre class="prettyprint">
             System.out.format("Bridged Message ID : %s\n", messageReceived.getStringProperty("HQ_BRIDGE_MSG_ID_LIST"));
         </pre>
        
         <li>And finally, <b>always</b> remember to close the JMS connections and 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">
             finally
             {
                if (initialContext != null)
                {
                   initialContext.close();
                }
                if (sourceConnection != null)
                {
                   sourceConnection.close();
                }
                if (targetConnection != null)
                {
                   targetConnection.close();
                }     
             }
          </pre>
     </ol>
  </body>
</html>