以往咱們監聽消息隊列的時候,一般都是用EJB的MDB(Message-driven bean). 這須要EJB容器的支持。springframework4 對JMS的支持 使得咱們使用常規的POJO就能夠做爲監聽器 接收消息隊列的信息了。java
Message-Driven Pojos 其實就是一種普通的POJO,只是實現了 MessageListener 接口。spring
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"); } } }
這個接口是Spring自身提供的接口,相似MessageListener接口,它多了Session的處理能力,使得在接收到消息的時候session
可以對Session進行處理。
測試
package org.springframework.jms.listener; public interface SessionAwareMessageListener { void onMessage(Message message, Session session) throws JMSException; }
這個類也是Spring自身提供的一個適配器,它的做用是 適配任何一個pojo 做爲 監聽器 而不用顯式地實現以上提到的2個接口。this
配置方式有點相似JMStemplate, 須要在Spring的config文件裏面 顯式地定義它, 並告知須要適配哪一個類和方法。
spa
<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 } }
顧名思義,它是一個監聽器容器,基於Spring MDP的listener 都須要放到這個容器裏面 才能正常工做。code
它的定義很簡單,在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是須要放到 beans 池中交給spring 來管理的。
get
若是是使用適配器方式來聲明監聽器應該不是須要再註冊這個MDP了(筆者還未通過實際測試)
<!-- this is the Message Driven POJO (MDP) --> <bean id="messageListener" class="jmsexample.ExampleListener" />
須要編寫一個pojo來做爲 監聽器。這個 監聽器可實現 MessageListener或者SessionAwareMessageListener 接口
若是不想實現接口 能夠交給MessageListenerAdapter 這個適配器來管理。
MDP 是須要註冊到 spring 的 上下文 來管理的
Spring 設定了 ListenerContainer 來管理監聽器。因此說要實現 監聽器,就必須聲明一個或若干個ListenerCotainer