Contents


The Spring series, Part 4

1-2-3 messaging with Spring JMS

Spring JMS makes enterprise messaging a walk in the park

Comments

Content series:

This content is part # of # in the series: The Spring series, Part 4

Stay tuned for additional content in this series.

This content is part of the series:The Spring series, Part 4

Stay tuned for additional content in this series.

In this fourth and final installment of the Spring series, I introduce you to features of the Spring JMS (Java Message Service) framework. JMS описывает стандартный путь создавать и обмениваться сообщениями для Java приложенией с помощью Message Oriented Middleware (MOM).

Как и в предыдущих частях, я буду использовать пример банковского приложения, чтобы показать возможности Spring JMS. Вы увидите как разрабатывать систему точка-к-точке (P2P) отправления сообщений, исспользуя Spring JMS и интегрировать IBM WebSphere MQ через JMS интерфейс. После выполнения примера, Вы сможете отправлять и получать простые текстовые сообщения с помощью системы.

Скачайте исходники статьи прежде чем начать. See Related topics to access the Spring framework and IBM WebSphere MQ 5.3. Вам также понадобится Apache Ant для запуска приложения.

Spring JMS

Spring JMS фреймворк упрощает использование JMS API и легко интегрируется с JMS провайдерами, такими как IBM's WebSphere MQ 5.3. Пакет org.springframework.jms.core предоставляет основую функциональность для использования JMS в Spring. Шаблонные классы упрощают использование JMS с помощью управления созданием и освобождением ресурсов.

Как большинство остальных шаблонных классов Spring, шаблонные классы JMS предоставляют вспомогательные методы, которые выполняют основные операции. В случаях, когда требуется более сложное использование, классы делегируют задачи к интерфейсам, реализованными пользователем. The JMS classes offer convenience methods for sending a message, consuming a message synchronously, and exposing a JMS session and message producer to the user.

Вместе с org.springframework.jms.core, следующие JMS пакеты, предоставляют Spring JMS функциональность:

org.springframework.jms.support
Предоставляет функциональность для перевода JMSExceptions. "Перевод" - это превращение иерархии проверяемых исключений JMSException в отображенную иерархию не проверяемых исключений.
org.springframework.jms.support.converter
Предоставляет абстракцию MessageConverter для конвертирования между Java объектами и JMS сообщениями.
org.springframework.jms.support.destination
Предоставляет различные стратегии для управления адресатами JMS, такими как сервис локатор для адресатов, сохраненных в JNDI.
org.springframework.jms.connection
Предоставляет реализацию ConnectionFactory, подходящую для одиночных приложений. The connection package also contains an implementation of Spring's PlatformTransactionManager for JMS. Это позволяет интегрировать JMS как транзакционный ресурс в транзакциях Spring'а .

IBM WebSphere MQ

Как было отмечено ранее, пример приложения будет использовать Spring JMS фреймворк, и интегрироваться с IBM's WebSphere MQ через JMS интерфейс. WebSphere MQ предоставляет надежную, масштабируемую интеграцию с приложениями, отправляя сообщения между приложениями и веб службами. Использует очередь сообщений и транзакции, чтобы сохранить целостность сообщений, при передаче по сети. WebSphere MQ уменьшает риск потери информации и необходимость согласовывать коммуникации между информационными системами.

WebSphere MQ предоставляет постоянный интерфейс (MQI) на всех поддерживаемых платформах, что позволяет делать интегрируемые приложения - портируемыми. В дополнении к стандартному интерфейсу, WebSphere MQ так же полностью реализует JMS интерфейс, включая поддержку передачи сообщений через "подписаться-и-отправить" метод. WebSphere MQ Explorer включает всю MQ сеть для администрирования и удаленного конфигурирования. Средство для администрирования и конфигурирования основано на открытом Eclipse фреймворке, и доступно для расширения.

Шаблон Spring JMS

Фреймворк Spring предоставляет две реализации JmsTemplate. Класс JmsTemplate использует JMS 1.1 API, а наследник JmsTemplate102 использует JMS 1.0.2 API. Пример приложения использует JmsTemplate102.

JMS шаблон используется для посылки и получения JMS сообщений. Spring использует механизмы обратного ответа для управления системой сообщений JMS. MessageCreator создает сообщение данной Session, вызываемой в коде JmsTemplate. Для более сложного использования JMS API, SessionCallback обеспечивает пользователя JMS сессией и ProducerCallback выставляет пару объектов Session и MessageProducer.

Листинг 1 показывает конфигурацию JMS шаблона, который используется в примере. Это экстракт из spring-mqseries-jms.xml (обратитесь к секции Download).

Листинг 1. JMS конфигурация
  
  
    
      
    
    
      
    
    
      false
    
    
      20000
    
  

jmsQueueTemplate связан с JMS connection factory и JMS destination resolver для определения пунктов назначения поставляемых JMS клиентами через JNDI. connectionFactory определяет как получить соединение к JMS провайдеру. В нашем случаем, Листинг 2 показывает как получить фабрику соединений из JNDI.

Листинг 2. Настройка JMS connection factory с помощью JNDI
 
  
    
      
    
    
      MQ_JMS_MANAGER
    
  

Как Вы можете видеть JndiObjectFactoryBean связан с internalJmsQueueConnectionFactory. JndiObjectFactoryBean использует свойство JndiTemplate для поиска JNDI. Spring будет искать фабрику по созданию соединенией в JNDI, используя свойства окружения и первоначальный контекст, описанный в JndiTemplate. Листинг 3 содержит конфигурацию JndiTemplate.

Листинг 3. Конфигурация JNDI шаблона для JNDI lookup

    
      
        
            com.sun.jndi.fscontext.RefFSContextFactory
        
        
            file:/C:/JNDI-Directory
        
      
    
  

Эта конфигурация описывает начальный контекст как com.sun.jndi.fscontext.RefFSContextFactory and the provider URL as the file-based file:/C:/JNDI-Directory for JNDI lookup. For the purpose of the example application, the JNDI access will use the file-based FSContext version (see Related topics) configured for binding MQ queues to JNDI.

With the JMS template defined, the next step is to wire it into the example application, after which you can use it to send and receive messages.

Spring JMS implementation

The JMS template can be wired into an application to send and receive JMS messages. In Listing 4 you can see how I wired the JMS template from Listing 1 into my example application.

Листинг 4. Wiring JmsTemplate into an application
  
    
      
    

    

    
    
        
      

    

As you can see, I wired jmsQueueTemplate into both the JmsSender application bean and the JmsReceiver bean used to send and receive messages. Listing 5 shows relevant code for the JMSSender class.

Listing 5. JMSSender using JmsTemplate to send JMS messages
 public class JMSSender {

   private JmsTemplate102 jmsTemplate102;

   public JmsTemplate102 getJmsTemplate102() {
     return jmsTemplate102;
   }

   public void setJmsTemplate102(JmsTemplate102 jmsTemplate102) {
     this.jmsTemplate102 = jmsTemplate102;
   }

   public void sendMesage(){
     jmsTemplate102.send("JMS_RequestResponseQueue", 
                  new MessageCreator() {
        public Message createMessage(Session session) 
                  throws JMSException {
          return session.createTextMessage("This is a sample message");
        }
      });


   }

The JMSSender class sends JMS messages with the jmsTemplate102.send() method. The first parameter to the send() method is the JNDI queue name, which specifies where messages should be sent. (You'll see in a moment how the WebSphere MQ's queue name is bound to JNDI.) The second parameter for the send() method is the MessageCreator class. Given a Session provided by the calling code in the JmsTemplate, this class provides a callback interface to create a JMS message.

The next step is to create a simple text message using the JMS Session class. The message will be delivered to the WebSphere MQ server's queue on the execution of the code. Listing 6 shows the JMSReceiver application bean code using the JmsTemplate to receive a JMS message.

Listing 6. JMSReceiver using JmsTemplate to receive a JMS message
  public class JMSReceiver {

    private JmsTemplate102 jmsTemplate102;

    public JmsTemplate102 getJmsTemplate102() {
      return jmsTemplate102;
    }

    public void setJmsTemplate102(JmsTemplate102 jmsTemplate102) {
     this.jmsTemplate102 = jmsTemplate102;
    }

    public void processMessage(){
      Message msg = jmsTemplate102.receive("JMS_RequestResponseQueue");
      try{
        TextMessage textMessage = (TextMessage) msg;
        if( msg!=null){
        System.out.println(" Message Received -->" + 
                    textMessage.getText());
        }


      }catch(Exception e){
            e.printStackTrace();
      }


    }
}

The JMSReceiver class uses the jmsTemplate102.receive() method to receive JMS messages synchronously.The receive() method specifies the JNDI queue name from which to retrieve messages. The processMessage() method of JMSTemplate class will be called by the receiving JMS clients. The JSMTemplate bean property receiveTimeout (listed in the JMSTemplate configuration) specifies the amount of time receiving clients will wait to synchronously receive messages from the queue.

And with that the application code is done! My next step is to configure the WebSphere MQ queues and bind them to JNDI objects.

Queue manager setup

Before I can run the application, I need to set up the WebSphere MQ queue manager and queues and bind them to JNDI. You can follow along with this part of the example, if you like: just download the batch file for setting up the WebSphere MQ queues and the source code and deployment descriptors for the application. Extract the zip file to your C: drive.

Set up the queues
Run the mqsetup.bat file provided in the C:\SpringSeriesPart4JMS\batch folder. This batch file requires that you set in your environment path variable the bin folder of an MQ installation (such as C:\mqseries\bin). After running the batch file, you should see the message "All valid MQSC commands were processed." To open the MQ Explorer and check that queue managers and queues were created, select Start -> Programs -> IBM MQSeries -> MQSeriesExplorer. Figure 1 shows that the example application QueueManagerMQJMS.QManager was created and is running.

Рисунок 1. QueueManager Configuration for WebSphere MQ
QueueManager Configuration for WebSphere MQ
QueueManager Configuration for WebSphere MQ

Click the Queues folder below MQJMS.QManager on the left pane of your application screen. You should see that one queue RequestResponseQueue was also created, as seen in Figure 2.

Рисунок 2. Request/response queue configuration for WebSphere MQ
Request/response queue configuration for WebSphere MQ
Request/response queue configuration for WebSphere MQ

This completes the setup of queues.

Set up JMS and JNDI administration

In the example application, the JNDI access makes use of the file-based FSContext version available from the JNDI homepage (see Resources). The FSContext.jar file is also included as part of WebSphere MQ's JMS support. Add the folders \MQSeriesInstallable\MQSeries\Java\lib and \MQSeriesInstallable\MQSeries\Java\bin to your system's PATH environment variable. Also, add all the jar files in the \MQSeriesInstallable\MQSeries\Java\lib folder to your system's CLASSPATH environment variable. You can also run the classpath.cmd batch file provided in the C:\SpringSeriesPart4JMS\batch folder, which sets the necessary path and CLASSPATH variables. To do so, just modify the MQ_JAVA_INSTALL_PATH variable in the classpath.cmd file to point to your WebSphere MQ JMS installation directory.

Next, modify the JMSAdmin.config configuration file in the \MQSeriesInstallableDirectory\Java\bin used by the MQSeries JMS administration to indicate the context factory and address of the JNDI implementation that the application will use. Uncomment the following line:

INITIAL_CONTEXT_FACTORY=com.sun.jndi.fscontext.RefFSContextFactory

and comment out the remaining two INITIAL_CONTEXT_FACTORY variables. Also uncomment the following line:

PROVIDER_URL=file:/C:/JNDI-Directory

and comment out the remaining two PROVIDER_URL variables.

You'll find a sample configuration file provided for reference in the C:\SpringSeriesPart4JMS\batch folder.

To store JNDI objects, make a directory named JNDI-Directory on your C: drive. Switch over to the \MQSeriesInstallableDirectory\Java\bin directory and run the JMSAdmin batch file and you should see the the InitCtx variable.

Type in the following, one after the other:

def qcf(MQ_JMS_MANAGER) qmgr(MQJMS.QManager)
press Enter
def q(JMS_RequestResponseQueue) qmgr(MQJMS.QManager) queue(RequestResponseQueue)
press Enter

You have now bound the WebSphere MQ queues to JNDI objects, which can be looked up as application clients through JNDI. All that is left to do is see the code in action!

Running the example

To run the example, download the Spring framework and all its dependency files from spring sourceforge download and extract it to, for example, c:\. The folder C:\spring-framework-1.2-rc2 (or latest versions) will be created.

To run the Spring application, extract the article source code to any folder, such as c:\. The folder SpringSeriesPart4JMS will be created. As previously mentioned, you will also need to have Apache Ant and its Spring dependency jar files installed. Copy the Spring libraries -- namely spring.jar from C:\spring-framework-1.2-rc2 \dist and commons-logging.jar -- from C:\spring-framework-1.2-rc2\lib\jakarta-commons to the SpringSeriesPart4JMS\lib folder. Also copy all jar libraries from the \MQSeriesInstallableDirectory\Java\lib directory to the SpringSeriesPart4JMS\lib folder. This contains MQseries and JMS-related libraries. You now have the build dependency set.

Next, open up the command prompt and change the directory to SpringProject4 and type the following at command prompt:

> ant -f build-jmssender.xml.

This will build and run the SendMQSpringJMS class, which calls the JMSSender class for sending a text message to the WebSphere MQ RequestResponse queue. SendMQSpringJMS also loads the spring configuration files through its ClassPathXmlApplicationContext. Once the beans are loaded, JMSSender can be accessed through the Spring ApplicationContext getBean() method (see Listing 7).

Listing 7. Loading the Spring configuration for the example application
ClassPathXmlApplicationContext appContext = 
                   new ClassPathXmlApplicationContext(new String[] {
     "spring-mqseries-jms.xml"
    });

JMSSender jmsSender = (JMSSender)
        appContext.getBean("jmsSender");

Once the message is delivered on the queue, run the JMS receiver client to retrieve it. Open up the command prompt, change the directory to SpringProject4, and type:

> ant -f build-jmsreceiver.xml

This will build and run the ReceiveMQSpringJMS class, which calls the JMSReceiver class to receive a text message from the WebSphere MQ RequestResponse queue. The following message prints at the console:

Message Received --> This is a sample message.

В завершении

В последней статье, Вы узнали основы фреймворка Spring JMS. В начале я показал I first introduced the существенные компоненты примера - Spring JMS и IBM's WebSphere MQ 5.3 - затем показал как использовать шаблоны Spring JMS, чтобы отправлять сообщения в очередь WebSphere MQ. Так как пример довольно прост, то Вы можете легко расширить приложение, для его усложенения.

Я надеюсь, что этот цикл статей, познакомил Вас с основами фреймворка Spring. See Related topics to learn more about the Spring framework and Spring JMS.


Downloadable resources


Related topics


Comments

Sign in or register to add and subscribe to comments.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=1
Zone=Web development, Java development, WebSphere
ArticleID=94709
ArticleTitle=The Spring series, Part 4: 1-2-3 messaging with Spring JMS
publish-date=10042005