Java EE MDB using a local transaction Example


This example shows you how to send a message to an MDB and deliver it within a local transaction

The example will send deploy a simple MDB and demonstrate sending a message and the MDB consuming it, throwing an exception and the message being re delivered.

JBoss AS configuration

Please refer to JBoss Messaging Quickstart guide to install it in JBoss AS 5

Example step-by-step

To deploy and start the server, simply type ant deploy from the example directory

To run the example, simply type ant from the example directory

To remove the example profile, simply type ant undeploy from the example directory

** make sure that JBOSS_HOME is set to the Jboss installation directory


  1. 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 jndi.properties file in the directory config
  2.            initialContext = new InitialContext();
            
  3. We look up the JMS queue object from JNDI
  4.            Queue queue = (Queue) initialContext.lookup("/queue/testQueue");
            
  5. We look up the JMS connection factory object from JNDI
  6.            ConnectionFactory cf = (ConnectionFactory) initialContext.lookup("/ConnectionFactory");
            
  7. We create a JMS connection
  8.            connection = cf.createConnection();
            
  9. We create a JMS session. The session is created as non transacted and will auto acknowledge messages.
  10.            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            
  11. We create a JMS message producer on the session. This will be used to send the messages.
  12.           MessageProducer messageProducer = session.createProducer(queue);
           
  13. We create a JMS text messages that we are going to send.
  14.             TextMessage message = session.createTextMessage("This is a text message");
            
  15. We send messages to the queue
  16.            messageProducer.send(message);
            
  17. The MDB receives the message
    We know the message is a TextMessage so we cast to it.
  18.            TextMessage tm = (TextMessage)message;
            
  19. The MDB gets the text and prints it, we take a quick look at the transaction and throw an exception.
  20.             System.out.println("message " + text + " received");
    
                 if (!textMessage.getJMSRedelivered())
                 {
                    //Step 11. On first delivery get the transaction, take a look, and throw an exception
                    Transaction tx = tm.getTransaction();
    
                    if (tx != null)
                    {
                       System.out.println("something is wrong, there should be no global transaction: " + tx);
                    }
                    else
                    {
                       System.out.println("there is no global transaction, altho the messge delivery is using a local transaction");
                       System.out.println("lets throw an exception and see what happens");
                       throw new RuntimeException("DOH!");
                    }
                 }
                
            
  21. The MDB receives the message again and we print a message.
  22.            System.out.println("The message was redelivered since the message delivery used a local transaction");
            
  23. And finally, always remember to close your JMS connections and resources after use, in a finally block. Closing a JMS connection will automatically close all of its sessions, consumers, producer and browser objects
  24.            finally
               {
                  if (initialContext != null)
                  {
                    initialContext.close();
                  }
                  if (connection != null)
                  {
                     connection.close();
                  }
               }