2014-10-31 06:20:28 -04:00
< html >
< head >
2014-11-19 03:44:57 -05:00
< title > ActiveMQ JMS Bridge Example< / title >
2014-10-31 06:20:28 -04:00
< 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
2014-11-19 03:44:57 -05:00
JMS Bridge to bridge a legacy JMS provider to ActiveMQ during migration.< / p >
2014-10-31 06:20:28 -04:00
< 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 / >
2014-11-19 14:58:44 -05:00
< 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 >
2014-10-31 06:20:28 -04:00
< 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" >
< jms-bridge name="myBridge">
< source>
< connection-factory name="ConnectionFactory" />
< destination name="queue/sourceQueue" />
< /source>
< target>
< connection-factory name="ConnectionFactory" />
< destination name="queue/targetQueue" />
< /target>
< quality-of-service>AT_MOST_ONCE< /quality-of-service>
< failure-retry-interval>1000< /failure-retry-interval>
< max-retries>7890< /max-retries>
< max-batch-size>1< /max-batch-size>
< max-batch-time>1000< /max-batch-time>
< /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 >