一、概述
当调用JmsTemplate的receive()方法时,JmsTemplate会尝试从ActiveMQ中获取一个消息。如果没有可用的消息,receive()方法会一直等待,直到获得消息为止。也就是说该方法时同步的。这意味着接收者必须耐心等待消息的到来,因此receive()方法会一直被阻塞,直到有可用消息(或者消息超时)。
可喜的是Spring2.0提供了他自己的消息驱动Bean形式来满足异步接收消息的需求,这种形式与EJB3的MDB非常相似。这里我只介绍最流行的消息驱动POJO(基于Spring的),EJB3的不进行介绍。
二、声明一个POJO来异步接收消息
发送消息的代码如下:
/** * 使用JmsTemplate发送序列化消息 * @param user */ public void send(final User user){ jmsTemplate.send(new MessageCreator() { @Override public ObjectMessage createMessage(Session session) throws JMSException { ObjectMessage msg = session.createObjectMessage(); msg.setObject(user); return msg; } }); }
声明UserHandler用来接收消息代码如下:
package com.gosun.jms.pojo; import com.gosun.jms.domain.User; public class UserHandler{ public void handler(User user){ System.out.println("异步接收消息:"+user); } }
Spring提供了能够以POJO的方式处理消息的能力,这些消息来自于JMS队列或者主题中,这就是Spring的强大之处。
三、配置消息监听器
为POJO赋予接收消息的能力还需要在spring中把他配置为消息驱动器。Spring的jms命名空间为我们提供了所需要的一切。代码如下,把上面的POJO(UserHandler),配置为消息驱动器代码如下:
<bean id="userHandler" class="com.gosun.jms.pojo.UserHandler"></bean> <jms:listener-container connection-factory="connectionFactory"> <!-- 可以有多个 --> <jms:listener destination="queue.destination" ref="userHandler" method="handler"/> </jms:listener-container>
上述代码中,我们在消息监听器容器中包含了一个消息监听器。消息监听器容器是一个特殊的bean,可以监控JMS目的地并等待消息的到达。一旦消息到达,他取出消息,然后把消息传给任意一个对此消息感兴趣的消息监听器。
- <jms:listener-container>:消息驱动器容器,connection-factory="connectionFactory"属性配置了连接工厂。容器中的<jms:listener>都使用这个连接工厂进行监听.
- <jms:listener>:消息监听器,他标识了一个bean和一个可以处理消息的方法。