activemq-artemis/examples/javaee/jms-bridge
Clebert Suconic 9a587c5633 ACTIVEMQ6-3 renaming package names from activemq6 to activemq
https://issues.apache.org/jira/browse/ACTIVEMQ6-3

We are renaming packages from activemq6 to activemq as that's more generic and version independent
The previous commit renamed the directories. On this commit now I'm changing the code.
If we changed the code and the directories on the same commit git would remove and add a lot of files
without recognizing the renames.
2014-11-17 09:33:53 -05:00
..
server/standalone/configuration ACTIVEMQ6-1 - Initial HornetQ Donation Commit 2014-11-10 10:31:25 -06: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 ACTIVEMQ6-1 - Initial HornetQ Donation Commit 2014-11-10 10:31:25 -06:00

readme.html

<html>
  <head>
    <title>HornetQ 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 HornetQ 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-hornetq/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>