ActiveMQ在Spring中异步接收消息(六)

一、概述

     当调用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和一个可以处理消息的方法。

相关推荐