1. 概述:Spring提供了一个用于简化JMS API使用的抽象框架,并且对用户屏蔽了JMS API中1.0.2和1.1版本的差异。
JMS的功能大致上分为两块,叫做消息制造和消息消耗。JmsTemplate 用于制造消息和同步消息接收。我们今天就用JmsTemplate实现同步的消息接受。
使用JMS发(接)消息的步骤:
  1)创建连接工厂
  2)使用连接工厂创建连接
  3)使用连接创建会话
  4)获取一个目的地
  5)使用会话和目的地创建消息生产者(消息消费者)
  6)使用连接创建一个需要发送的消息类型实例
  7)使用连接的一个队列发送器或主题公布器,使用发送器或者主题器发送消息(接受消息)

spring中的JmsTemplate实现了对jms的一些封装,内部提供了很多的方法,我们只需要实现定义的回调接口即可。JmsTemplate继承自JmsAccessor,在JmsAccessor中有ConnectionFactory的定义,而JmsTemplate本身的构造方法也有对ConnectionFactory的封装:
Java代码
 

 

  1. public JmsTemplate(ConnectionFactory connectionFactory) {   
  2.         this();   
  3.         setConnectionFactory(connectionFactory);   
  4.         afterPropertiesSet();   
  5. }  

所以,我们有两种方式注入ConnectionFactory,本文我们采用构造方法的方式。

spring_jms.xml
Java代码
 

 

  1. "1.0" encoding="UTF-8"?>   
  2. "http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">   
  5.            
  6.     
  7. "jmsTemplate" class = "org.springframework.jms.core.JmsTemplate">   
  8.     "connectionFactory">   
  9.   
  10.   
  11.   
  12. "connectionFactory" class = "org.apache.activemq.ActiveMQConnectionFactory">   
  13.     "brokerURL" value="vm://localhost" />   
  14.   
  15.   
  16.   
  17. "destination" class="org.apache.activemq.command.ActiveMQQueue">   
  18.         "test/queue"/>    
  19.   
  20.   
  21.   


MessageCreator 回调接口通过JmsTemplate中调用代码提供的Session来创建一条消息。
看一下MessageCreator接口:
Java代码
 

 

  1. public interface MessageCreator {   
  2.   
  3.     Message createMessage(Session session) throws JMSException;   
  4.   
  5. }   


那么,我们来实现发送和接受消息DummyJms类
Java代码
 

 

  1. public class DummyJms {   
  2.        
  3.     public static void main(String[] args) throws Exception{   
  4.         ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");   
  5.         JmsTemplate jmsTemplate = (JmsTemplate)context.getBean("jmsTemplate");   
  6.         Destination destination = (Destination)context.getBean("destination");   
  7.            
  8.         jmsTemplate.send(destination, new MessageCreator(){   
  9.                    
  10.                 public Message createMessage(Session session)   
  11.                         throws JMSException {   
  12.                     return session.createTextMessage("send message ");   
  13.                 }   
  14.                    
  15.                
  16.         });   
  17.            
  18.         TextMessage msg = (TextMessage)jmsTemplate.receive(destination);   
  19.         System.out.println("receive message = " + msg.getText());   
  20.            
  21.     }   
  22.        
  23. }  


输出结果:
receive message = send message


可是我们并没有看到的像前文描述的那那些创建消息生产者,消息消费者的一些东西。继续分析,我们可以看一下,
jmsTemplate.send(Destination destination,MessageCreator messageCreator)这里到底做了什么,可以让我们不费吹灰之力,就可以实现消息的发送。JmsTemplate源代码:

Java代码
 

 

  1. public void send(final Destination destination, final MessageCreator messageCreator) throws JmsException {   
  2.         execute(new SessionCallback() {   
  3.             public Object doInJms(Session session) throws JMSException {   
  4.                 doSend(session, destination, messageCreator);   
  5.                 return null;   
  6.             }   
  7.         }, false);   
  8. }