activemq-artemis/examples/javaee/mdb-cmt-setrollbackonly-wit...
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 SetRollbackOnly 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 SetRollbackOnly with DLQ Example</h1>

     <p>This example shows you how to send a message to an MDB and then roll back the transaction forcing delivery of the message to a DLQ.</p>
     <p>The example will send deploy a simple MDB and demonstrate sending a message, MDB consuming it, and then the
         standalone client consuming it from the DLQ and printing out the special DLQ properties "_HQ_ORIG_ADDRESS"
         and "_HQ_ORIG_QUEUE".</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("jms/queues/testQueue");
        </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">
           Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        </pre>

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

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

        <li>We send messages to the queue</li>
        <pre class="prettyprint">
           producer.send(message);
        </pre>
        
        <li>The MDB receives the message<br />
            We know the message is a TextMessage so we cast to it.</li>
        <pre class="prettyprint">
           TextMessage tm = (TextMessage)message;
        </pre>
            
        <li>The MDB gets the text and prints it</li>
        <pre class="prettyprint">
             String text = textMessage.getText();
             System.out.println("message " + text + " received");
        </pre>

        <li>The MDB rolls back the container-managed transaction to send the message to the DLQ</li>
        <pre class="prettyprint">
             ctx.setRollbackOnly();
        </pre>

        <li>Perform a lookup on the DLQ</li>
        <pre class="prettyprint">
            destination = (Destination) initialContext.lookup("jms/queues/dlq");
        </pre>

        <li>Create the consumer and start the connection</li>
        <pre class="prettyprint">
            MessageConsumer consumer = session.createConsumer(destination);
            connection.start();
        </pre>

        <li>Receive the message.</li>
        <pre class="prettyprint">
            message = (TextMessage) consumer.receive(3000);
        </pre>

        <li>Print the special DLQ properties</li>
        <pre class="prettyprint">
             System.out.println("Original address: " + message.getStringProperty("_HQ_ORIG_ADDRESS"));
             System.out.println("Original queue: " + message.getStringProperty("_HQ_ORIG_QUEUE"));
        </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">
           finally
           {
              if (initialContext != null)
              {
                initialContext.close();
              }
              if (connection != null)
              {
                 connection.close();
              }
           }
        </pre>
     </ol>
  </body>
</html>