JMS Scheduled Message Example

This example shows you how to send a scheduled message to a JMS Queue using ActiveMQ.

A Scheduled Message is a message that will be delivered at a time specified by the sender. To do this, simply set a HDR_SCHEDULED_DELIVERY_TIME header property. The value of the property should be the time of delivery in milliseconds.

In this example, a message is created with the scheduled delivery time set to 5 seconds after the current time.

Example step-by-step

To run the example, simply type mvn verify -Pexample from this 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 client-jndi.properties file in the directory ../common/config
  2.            InitialContext initialContext = getContext();
            
  3. We look-up the JMS queue object from JNDI
  4.            Queue queue = (Queue) initialContext.lookup("/queue/exampleQueue");
            
  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 producer = session.createProducer(queue);
           
  13. We create a JMS text message that we are going to send.
  14.            TextMessage message = session.createTextMessage("This is a scheduled message message which will be delivered in 5 sec.");
            
  15. We schedule the delivery time to be 5 sec later.
  16.            
                long time = System.currentTimeMillis();
                time += 5000;
                message.setLongProperty(MessageImpl.HDR_SCHEDULED_DELIVERY_TIME.toString(), time);
               
            
  17. We send message to the queue
  18.            messageProducer.send(message);
            
  19. We create a JMS Message Consumer to receive the message.
  20.            MessageConsumer messageConsumer = session.createConsumer(queue);
            
  21. We start the connection. In order for delivery to occur on any consumers or subscribers on a connection, the connection must be started
  22.            connection.start();
            
  23. We use a blocking receive() to consume the message and see when the message arrives.
  24.            TextMessage messageReceived = (TextMessage) messageConsumer.receive();
            
  25. 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
  26.            finally
               {
                  if (initialContext != null)
                  {
                    initialContext.close();
                  }
                  if (connection != null)
                  {
                     connection.close();
                  }
               }
            

More information