activemq-artemis/examples/javaee/mdb-remote-failover
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 Java EE MDB Message Selector 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>Java EE MDB Remote Failover Example</h1>

     <p>This example shows you how to send a message to an MDB that is configured to consume from a live/backup pair.</p>
     <p>The example will send deploy a simple MDB to one Wildfly instance. Then it will send a message to the live server of the live/backup pair
         which will be consumed by the MDB after which the MDB will send a reply message which will be consumed by the example program. Then the live
         server will be stopped so that the backup takes over and the process will be repeated.</p>

     <p>Unlike the "Java EE MDB Remote Failover Static Example," this example uses a "dynamic" configuration for finding all the nodes. In other words
         it uses UDP multicast for server discovery.</p>

     <p>The example leverages the JBoss Arquillian framework to run a WildFly instance and deploy the MDB.</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>

     <ol>
        <li>First we need to get an initial context so we can look-up the JMS connection factory and destination objects from JNDI. This initial context will get it's properties from the <code>jndi.properties</code> file in the directory <code>config</code></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 queue object from JNDI</li>
        <pre class="prettyprint">
           Queue queue = (Queue) initialContext.lookup("/queues/inQueue");
        </pre>

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

        <li>We create a JMS connection</li>
        <pre class="prettyprint">
           connection = cf.createConnection("guest", "password");
        </pre>

        <li>We create a JMS session. The session is created as non transacted and will auto acknowledge messages.</li>
        <pre class="prettyprint">
           <code>Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);</code>
        </pre>

        <li>We create a JMS message producer on the session. This will be used to send the messages.</li>
        <pre class="prettyprint">
          <code>MessageProducer messageProducer = session.createProducer(queue);</code>
       </pre>

        <li>We create a JMS text messages that we are going to send.</li>
        <pre class="prettyprint">
           <code>TextMessage message = session.createTextMessage("This is a text message");</code>
        </pre>

        <li>We send the message to the queue</li>
        <pre class="prettyprint">
           <code>messageProducer.send(message);</code>
        </pre>

        <li>MDB receives the message</li>
        <pre class="prettyprint">
           <code>TextMessage textMessage = (TextMessage)message;</code>
        </pre>

         <li>Get and print the text</li>
        <pre class="prettyprint">
           <code>String text = textMessage.getText();

           System.out.println("message " + text);</code>
        </pre>

         <li>Create a JMS connection using the injected connection factory</li>
        <pre class="prettyprint">
           <code>conn = connectionFactory.createConnection();</code>
        </pre>

         <li>Create a JMS session</li>
        <pre class="prettyprint">
           <code>Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);</code>
        </pre>

         <li>Create a producer</li>
        <pre class="prettyprint">
           <code>MessageProducer producer = sess.createProducer(replyQueue);</code>
        </pre>

         <li>Create a message and send it to the reply queue</li>
        <pre class="prettyprint">
           <code>producer.send(sess.createTextMessage("this is a reply"));</code>
        </pre>

         <li>Client looks up the reply queue</li>
        <pre class="prettyprint">
           <code>queue = (Queue) initialContext.lookup("/queues/outQueue");</code>
        </pre>

         <li>Create a consumer</li>
        <pre class="prettyprint">
           <code>MessageConsumer messageConsumer = session.createConsumer(queue);</code>
        </pre>

         <li>Start the connection</li>
        <pre class="prettyprint">
           <code>connection.start();</code>
        </pre>

         <li>Receive the message and print it out</li>
        <pre class="prettyprint">
           <code>message = (TextMessage) messageConsumer.receive(20000);

               System.out.println("message.getText() = " + message.getText());</code>
        </pre>

         <li>Kill the live server. At this point both the standalone client and the MDB will fail-over to the backup.</li>
        <pre class="prettyprint">
           <code>killer.kill();</code>
        </pre>

         <li>Create another message</li>
        <pre class="prettyprint">
           <code>message = session.createTextMessage("This is another text message");</code>
        </pre>

         <li>Send the message</li>
        <pre class="prettyprint">
           <code>producer.send(message);</code>
        </pre>

         <li>The MDB will receive the message and send another message to the reply queue which the client then receives</li>
        <pre class="prettyprint">
           <code>message = (TextMessage) messageConsumer.receive(20000);</code>
        </pre>

        <li>And finally, <b>always</b> remember to close your 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">
           <code>finally
           {
              if (initialContext != null)
              {
                initialContext.close();
              }
              if (connection != null)
              {
                 connection.close();
              }
           }</code>
        </pre>
     </ol>
  </body>
</html>