mirror of
https://github.com/apache/activemq-artemis.git
synced 2025-02-23 02:44:10 +00:00
<html> <head> <title>ActiveMQ 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 ActiveMQ 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("activemq-ra-remote.rar")</code> which refers to this pooled-connection-factory:</p> <pre class="prettyprint"> <pooled-connection-factory name="activemq-ra-remote"> <transaction mode="xa"/> <user>guest</user> <password>password</password> <connectors> <connector-ref connector-name="remote-http-connector"/> </connectors> <entries> <entry name="java:/RemoteJmsXA"/> </entries> </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 ActiveMQ Server.</p> <pre class="prettyprint"> <pooled-connection-factory name="activemq-ra-remote"> <transaction mode="xa"/> <user>guest</user> <password>password</password> <connectors> <connector-ref connector-name="remote-http-connector"/> </connectors> <entries> <entry name="java:/RemoteJmsXA"/> </entries> </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 = ActiveMQJMSClient.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>