activemq-artemis/examples/javaee/mdb-cmt-setrollbackonly
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 Example</h1>

     <p>This example shows you how to send a message to an MDB and then roll back the transaction forcing re delivery</p>
     <p>The example will send deploy a simple MDB and demonstrate sending a message and the MDB consuming it twice.</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">
           messageProducer.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, if its the first time we roll back
        </li>
        <pre class="prettyprint">
             String text = textMessage.getText();

             if(!textMessage.getJMSRedelivered())
             {
                //Step 11. rollback delivery of message if the first time
                System.out.println("message " + text + " received for the first time");
                ctx.setRollbackOnly();
             }
        </pre>

         <li>The message is received again but this time we just print the text
        </li>
        <pre class="prettyprint">
            System.out.println("message " + text + " received for the second time");            
        </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>