SpringFramework4系列之SpringJMS:(四)異步接收消息 1.基本介紹

以往咱們監聽消息隊列的時候,一般都是用EJB的MDB(Message-driven bean). 這須要EJB容器的支持。springframework4 對JMS的支持 使得咱們使用常規的POJO就能夠做爲監聽器 接收消息隊列的信息了。java

使用MDP 接收消息

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");
        }
    }
}

SessionAwareMessageListener 接口

    這個接口是Spring自身提供的接口,相似MessageListener接口,它多了Session的處理能力,使得在接收到消息的時候session

可以對Session進行處理。
測試

package org.springframework.jms.listener;

public interface SessionAwareMessageListener {    

    void onMessage(Message message, Session session) throws JMSException;

}

MessageListenerAdapter 類

這個類也是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
    }
}

ListenerContainer

顧名思義,它是一個監聽器容器,基於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 到Spring

MDP是須要放到 beans 池中交給spring 來管理的。
get

若是是使用適配器方式來聲明監聽器應該不是須要再註冊這個MDP了(筆者還未通過實際測試)

<!-- this is the Message Driven POJO (MDP) -->
<bean id="messageListener" class="jmsexample.ExampleListener" />

總結

  1. 須要編寫一個pojo來做爲 監聽器。這個 監聽器可實現 MessageListener或者SessionAwareMessageListener 接口

  2. 若是不想實現接口 能夠交給MessageListenerAdapter 這個適配器來管理。

  3. MDP 是須要註冊到 spring 的 上下文 來管理的

  4. Spring 設定了 ListenerContainer 來管理監聽器。因此說要實現 監聽器,就必須聲明一個或若干個ListenerCotainer

相關文章
相關標籤/搜索