转载请出自出处:http://eksliang.iteye.com/blog/2243158
一、概述
当调用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和一个可以处理消息的方法。