JMS Colocated Failover Shared Store Example

This example demonstrates how you can configure a live server to scale down messages to another live server on shutdown.

This example starts 2 live servers each one with a connector configured for the other live server.

The second live server is killed and its messages are scaled down to the first server on shutdown.

The following shows how to configure the live servers to scale down to one another.

     
     <ha-policy>
         <live-only>
             <scale-down>
                 <connectors>
                     <connector-ref>server0-connector</connector-ref>
                 </connectors>
             </scale-down>
         </live-only>
     </ha-policy>
     
     

Example step-by-step

To run the example, simply type mvn verify from this directory

  1. Get an initial context for looking up JNDI for both servers
  2.            
        initialContext1 = getContext(1);
        initialContext = getContext(0);
       
            
  3. Look up the JMS resources from JNDI
  4.            
        Queue queue = (Queue)initialContext.lookup("/queue/exampleQueue");
        ConnectionFactory connectionFactory = (ConnectionFactory)initialContext.lookup("/ConnectionFactory");
        ConnectionFactory connectionFactory1 = (ConnectionFactory)initialContext1.lookup("/ConnectionFactory");
               
            
  5. Create a JMS Connections
  6.            
        connection = connectionFactory.createConnection();
        connection1 = connectionFactory1.createConnection();
               
            
  7. Create a *non-transacted* JMS Session with client acknowledgement
  8.            
        Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
        Session session1 = connection1.createSession(false, Session.CLIENT_ACKNOWLEDGE);
               
            
  9. Create a JMS MessageProducer
  10.            
        MessageProducer producer = session.createProducer(queue);
        MessageProducer producer1 = session1.createProducer(queue);
               
            
  11. Send some messages to both servers
  12.           
        for (int i = 0; i < numMessages; i++)
        {
          TextMessage message = session.createTextMessage("This is text message " + i);
          producer.send(message);
          System.out.println("Sent message: " + message.getText());
          message = session1.createTextMessage("This is another text message " + i);
          producer1.send(message);
          System.out.println("Sent message: " + message.getText());
        }
              
            
  13. Crash server #0, the live server
  14.           
        killServer(0);
              
            
  15. start the connection ready to receive messages
  16.            
        connection.start();
               
            
  17. create a consumer
  18.            
        MessageConsumer consumer = session.createConsumer(queue);
                
            
  19. Receive and acknowledge all of the sent messages, you will notice that messages from both servers are received
  20.            
        TextMessage message0 = null;
        for (int i = 0; i < numMessages; i++)
        {
           message0 = (TextMessage)consumer.receive(5000);
           System.out.println("Got message: " + message0.getText());
        }
        message0.acknowledge();
               
            
  21. And finally (no pun intended), always remember to close your JMS resources after use, in a finally block. Closing a JMS connection will automatically close all of its sessions, consumers, producer and browser objects
  22.            
        finally
        {
           if (connection != null)
           {
           connection.close();
           }
    
           if (initialContext != null)
           {
           initialContext.close();
           }
           if (connection1 != null)
           {
           connection1.close();
           }
    
           if (initialContext1 != null)
           {
           initialContext1.close();
           }
        }