mirror of
https://github.com/apache/activemq-artemis.git
synced 2025-02-08 02:59:14 +00:00
<html> <head> <title>ActiveMQ Client Side Failover Listener 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>Client Side Kickoff Example</h1> <p>This example demonstrates how you can listen on failover event on the client side.</p> <p>In this example there are two nodes running in a cluster, both server will be running for start, but after a while the first server will crash. This will trigger an fail-over event.</p> <h2>Example step-by-step</h2> <p><em>To run the example, simply type <code>mvn verify</code> from this directory</em></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 its properties from <a href="src/main/resources/activemq/server0/client-jndi.properties">client-jndi.properties</a></li> <pre class="prettyprint"> <code>InitialContext initialContext = getContext(0);</code> </pre> <li>We look up the JMS Queue object from JNDI</li> <pre class="prettyprint"> <code>Queue queue = (Queue)initialContext.lookup("/queue/exampleQueue");</code> </pre> <li>We look up a JMS Connection Factory object from JNDI on server 0</li> <pre class="prettyprint"> <code>ConnectionFactory connectionFactory = (ConnectionFactory)initialContext.lookup("/ConnectionFactory");</code> </pre> <li>We create a JMS connection from the same connection factory, wait a little while to make sure broadcasts from all nodes have reached the client</li> <pre class="prettyprint"> <code> Thread.sleep(5000); connectionA = connectionFactory.createConnection(); ((ActiveMQConnection)connectionA).setFailoverListener(new FailoverListenerImpl()); </code> </pre> <li>We create JMS Sessions</li> <pre class="prettyprint"> <code>Session sessionA = connectionA.createSession(false, Session.AUTO_ACKNOWLEDGE);</code> </pre> <li>We create JMS MessageProducer objects on the sessions</li> <pre class="prettyprint"> <code>MessageProducer producerA = sessionA.createProducer(queue);</code> </pre> <li>We send some messages on each producer</li> <pre class="prettyprint"> <code> final int numMessages = 10; for (int i = 0; i < numMessages; i++) { TextMessage messageA = sessionA.createTextMessage("A:This is text message " + i); producerA.send(messageA); System.out.println("Sent message: " + messageA.getText()); } </code> </pre> <li>We start the connection to consume messages</li> <pre class="prettyprint"> <code>connectionA.start();</code> </pre> <li>We consume messages from the session A, one at a time. We reached message no 5 the first server will crash</li> <pre class="prettyprint"> <code>consume(sessionA, queue, numMessages, "A");</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> if (connectionA != null) { connectionA.close(); } if (initialContext != null) { initialContext.close(); } </code> </pre> </ol> </body> </html>