activemq-artemis/examples/javaee/jca-remote
jbertram 034adfbf9b ACTIVEMQ6-4 Rename HornetQ* classes to ActiveMQ* 2014-11-18 16:53:09 -06:00
..
server/standalone/configuration ACTIVEMQ6-1 - Initial HornetQ Donation Commit 2014-11-10 10:31:25 -06:00
src ACTIVEMQ6-4 Rename HornetQ* classes to ActiveMQ* 2014-11-18 16:53:09 -06: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 JCA Remote Server Configuration 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 JCA Resource Adapter Remote Server Configuration Example</h1>
     <p>This example demonstrates how to configure the Resource adapter to connect to a remote HornetQ server</p>
     <p>This example is composed of a message driven bean and a client<p>
     <p>MDBRemoteServerClientExample will send a message to the MDB via a queue and wait for the MDB to send a response via
     a reply queue</p>

     <h2>WildFly configuration</h2>

     <p>The example leverages the Arquillian framework to run a WildFly instance and deploy the MDB.</p>

     <h2>Configuring the incoming JCA resource adapter</h2>

     <p>The MDB will consume messages via the inflow JCA resource adapter. This can be configured in 2 ways:</p>
     <ol>
         <li>via a pooled-connection-factory in the "messaging" subsystem</li>
         <li>via the activation configuration properties on the MDB set either via annotations or ejb-jar.xml</li>
     </ol>
     <p>In this example the MDB is annotated with <code>@ResourceAdapter("hornetq-ra-remote.rar")</code> which refers to
      this pooled-connection-factory:</p>
        <pre class="prettyprint">
                    &lt;pooled-connection-factory name="hornetq-ra-remote">
                        &lt;transaction mode="xa"/>
                        &lt;user>guest&lt;/user>
                        &lt;password>password&lt;/password>
                        &lt;connectors>
                            &lt;connector-ref connector-name="remote-http-connector"/>
                        &lt;/connectors>
                        &lt;entries>
                            &lt;entry name="java:/RemoteJmsXA"/>
                        &lt;/entries>
                    &lt;/pooled-connection-factory>
        </pre>
     <p>This configuration ensures the MDB will consume from the remote queue.</p>

     <h2>Configuring the outgoing JCA resource adapter</h2>

     <p>The same pooled-connection-factory used for JCA inflow also configures an outgoing JCA connection factory which Java EE components can use to send messages to the same remote HornetQ Server.</p>
     <pre class="prettyprint">
                    &lt;pooled-connection-factory name="hornetq-ra-remote">
                        &lt;transaction mode="xa"/>
                        &lt;user>guest&lt;/user>
                        &lt;password>password&lt;/password>
                        &lt;connectors>
                            &lt;connector-ref connector-name="remote-http-connector"/>
                        &lt;/connectors>
                        &lt;entries>
                            &lt;entry name="java:/RemoteJmsXA"/>
                        &lt;/entries>
                    &lt;/pooled-connection-factory>
     </pre>

     <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 send a JMS message to the second server.</li>
         <pre class="prettyprint">
            final Properties env = new Properties();

            env.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");

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

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

            initialContext = new InitialContext(env);
         </pre>
         <li>Look up the MDB's queue</li>
         <pre class="prettyprint">
            Queue queue = (Queue) initialContext.lookup("queues/mdbQueue");
         </pre>
         <li>look up the connection factory</li>
         <pre class="prettyprint">
            ConnectionFactory cf = (ConnectionFactory) initialContext.lookup("jms/RemoteConnectionFactory");
         </pre>
         <li>We then create a connection</li>
         <pre class="prettyprint">
            connection = cf.createConnection("guest", "password");
         </pre>
         <li>we then create a session</li>
         <pre class="prettyprint">
            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
         </pre>
         <li>we now create a message producer to send the message</li>
         <pre class="prettyprint">
            MessageProducer producer = session.createProducer(queue);
         </pre>
         <li>create a text message and send it</li>
         <pre class="prettyprint">
            producer.send(session.createTextMessage("a message"));
         </pre>
         <li>The MDB receives the text message</li>
         <pre class="prettyprint">
            TextMessage tm = (TextMessage)message;
         </pre>
         <li>The MDB looks up the reply queue</li>
         <pre class="prettyprint">
            Queue destQueue = HornetQJMSClient.createQueue("mdbReplyQueue");
         </pre>
         <li>The MDB creates a connection</li>
         <pre class="prettyprint">
            Connection connection = connectionFactory.createConnection();
         </pre>
         <li>The MDB creates a session</li>
         <pre class="prettyprint">
            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
         </pre>
         <li>The MDB creates a message producer to send the message</li>
         <pre class="prettyprint">
            MessageProducer producer = session.createProducer(destQueue);
         </pre>
         <li>The MDB creates and sends a text message</li>
         <pre class="prettyprint">
            producer.send(session.createTextMessage("A reply message"));
         </pre>
         <li>The MDB closes the connection which returns it to the pool</li>
         <pre class="prettyprint">
            connection.close();
         </pre>
         <li>The client now looks up the reply queue</li>
         <pre class="prettyprint">
            Queue replyQueue = (Queue) initialContext.lookup("queues/mdbReplyQueue");
         </pre>
         <li>and creates a message consumer to receive the message</li>
         <pre class="prettyprint">
            MessageConsumer consumer = session.createConsumer(replyQueue);
         </pre>
         <li>starting the connection starts delivery</li>
         <pre class="prettyprint">
            connection.start();
         </pre>
         <li>The message consumer receives the text message</li>
         <pre class="prettyprint">
            TextMessage textMessage = (TextMessage) consumer.receive(5000);
         </pre>
         <li>and we always clear up out JMS resources</li>
         <pre class="prettyprint">
            if (initialContext != null)
            {
               initialContext.close();
            }
            if (connection != null)
            {
               connection.close();
             }
         </pre>
      </ol>
  </body>
</html>