Show TOC

 Asynchronously Receiving Messages Sent to a TopicLocate this document in the navigation structure

This example uses the TopicSubscriber to register the class as an javax.jms.MessageListener instance:

import java.util.Properties;
import javax.naming.*;
import javax.jms.*;
/**
 * This class creates a topic connection, and then
 * sends to and receives messages from the Topic.
 */
public class AsynchTopic implements javax.jms.MessageListener {
  
   private static final String USER = "Administrator";
   private static final String PASSWORD = "admin_pass";
   private static final String SAP_NAMING_PROVIDER_URL = "localhost:50004";
   private static final String SAP_INITIAL_CONTEXT_FACTORY_IMPL =
      "com.sap.engine.services.jndi.InitialContextFactoryImpl";
 
   TopicConnectionFactory topicConnectionFactory = null;
   TopicConnection topicConnection = null;
   Topic topic = null;
   TopicSession topicSession = null;
   TopicPublisher topicPublisher = null;
   TopicSubscriber topicSubscriber = null;
   TextMessage textMessage1 = null;
  
   boolean flag = true;
   String text = "test string";
 
   /**
    * Get InitialContext with default values.
    */
   private InitialContext getInitialContext() {
      try {
         // set the properties for the InitalContext
         Properties properties = new Properties();
         properties.put(
            Context.INITIAL_CONTEXT_FACTORY,
            SAP_INITIAL_CONTEXT_FACTORY_IMPL);
         properties.put(Context.PROVIDER_URL, SAP_NAMING_PROVIDER_URL);
         properties.put(Context.SECURITY_PRINCIPAL, USER);
         properties.put(Context.SECURITY_CREDENTIALS, PASSWORD);
 

         // initialize and return the InitalContext with the specified               properties
         return new InitialContext(properties);
 
      } catch (NamingException ne) {
         System.out.println("NamingException: " + ne);
      }
      return null;
   }
 
   /**
    * Initializes JMS.
    */
   private void initJMS() {
      try {
         InitialContext context = getInitialContext();
 
         // look up the TopicConnectionFactory
         topicConnectionFactory =
            (TopicConnectionFactory) context.lookup(
               " jmsfactory/default/TopicConnectionFactory");
 
         // create topic connection
         topicConnection = topicConnectionFactory.createTopicConnection();
 
         // start the connection
         topicConnection.start();
 
      } catch (NamingException ne) {
         System.out.println("NamingException: " + ne);
      } catch (JMSException jmse) {
         System.out.println("JMSException: " + jmse);
      }
   }
 
   /**
    * Closes all resorces used in this test. This should be called
    * when you want to finish using JMS.
    */
   private void closeJMS() {
      try {
 
         //closes the jms topic session
         topicSession.close();
 
         //closes the jms topic connection
         topicConnection.close();
 
      } catch (JMSException jmse) {
         System.out.println("JMSException: " + jmse);
      }
   }
 
   /**
    * Create a topic, send and receive messages
    * and then close the connection.
    */
   public void aMethod() {
      try {
 
         // initializes all important data that will be used.
         initJMS();
 
         // create topic session
         topicSession =
            topicConnection.createTopicSession(
               false,
               Session.AUTO_ACKNOWLEDGE);
 
         // topic session's topic
         topic = topicSession.createTopic("ExampleTopic");
 
         // create sender
         topicPublisher = topicSession.createPublisher(topic);
 
         //create subscriber
         topicSubscriber = topicSession.createSubscriber(topic);
         topicSubscriber.setMessageListener(this);
 
         // create text message
         textMessage1 = topicSession.createTextMessage();
         textMessage1.setText(text);
 
         // send the message
         topicPublisher.publish(textMessage1);
 
         //topic subscriber is waiting for messages.
         while (flag) {
            try {
               Thread.sleep(1000);
            } catch (Exception e) {
               break;
            }
         }
 
         // clears all resources used by JMS
         closeJMS();
 
      } catch (JMSException e) {
         e.printStackTrace();
      }
   }
 
   /**
    * Implemented from the MessageListener interface.
    * Allows for asynchronous message receipt. Here you can
    * unpack the message.
    * @param message the newly received message
    */
   public void onMessage(Message message) {
      // do something with the message received.
      try {
         System.out.println(
            "Message reveived: " + ((TextMessage) message).getText());
         flag = false;
      } catch (JMSException jmse) {
         jmse.printStackTrace();
      }
   }
 
}