以往我们监听消息队列的时候,通常都是用EJB的MDB(Message-driven bean). 这需要EJB容器的支持。
springframework4 使得 使用常规的POJO 就可以作为监听器 接收消息队列的信息了。
使用MDP 接收消息
Message-Driven Pojos 其实就是一种普通的POJO,只是实现了 MessageListener 接口。
import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.TextMessage; public class ExampleListener implements MessageListener { public void onMessage(Message message) { if (message instanceof TextMessage) { try { System.out.println(((TextMessage) message).getText()); } catch (JMSException ex) { throw new RuntimeException(ex); } } else { throw new IllegalArgumentException("Message must be of type TextMessage"); } } }
SessionAwareMessageListener 接口
这个接口是Spring自身提供的接口,类似MessageListener接口,它多了Session的处理能力,使得在接收到消息的时候
能够对Session进行处理。
package org.springframework.jms.listener; public interface SessionAwareMessageListener { void onMessage(Message message, Session session) throws JMSException; }
MessageListenerAdapter 类
这个类是Spring自身提供的一个适配器,它的作用是 适配任何一个pojo 作为 监听器 而不用显示的实现 以上提到的2个接口。
配置方式有点类似JMStemplate, 需要在Spring的config文件里面 显示定义它, 并告知需要适配哪个类和方法。
<bean id="messageListener" class="org.springframework.jms.listener.adapter.MessageListenerAdapter"> <constructor-arg> <bean class="jmsexample.DefaultTextMessageDelegate"/> </constructor-arg> <property name="defaultListenerMethod" value="receive"/> </bean>
public class DefaultResponsiveTextMessageDelegate { public void receive(TextMessage message){ //handle message here } }
ListenerContainer
顾名思义,它是一个监听器容器,基于Spring MDP的listener 都需要放到这个容器里面 才能正常工作。
它的定义很简单,在spring config文件里面 显示声明一个Container, spring 默认提供了DefaultMessageListenerContainer。
并指定 connectionFactory,destination和 监听类
<!-- and this is the message listener container... --> <bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <property name="connectionFactory" ref="connectionFactory"/> <property name="destination" ref="destination"/> <property name="messageListener" ref="messageListener" /> </bean>
注册MDP 到Spring
MDP是需要放到 beans 池中交给spring 来管理的。
如果是使用适配器方式来声明监听器应该不是需要再注册这个MDP了(笔者还未经过实际测试)
<!-- this is the Message Driven POJO (MDP) --> <bean id="messageListener" class="jmsexample.ExampleListener" />
总结
- 需要编写一个pojo来作为 监听器。这个 监听器可实现 MessageListener或者SessionAwareMessageListener 接口
- 如果不想显示的实现接口 可以交给MessageListenerAdapter 来托管
- MDP 是需要注册到 spring 的 beans中 来管理的
- Spring 设定了 ListenerContainer 来管理监听器 使得监听器能够很好的工作
时间: 2024-10-14 06:54:47