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

以往我们监听消息队列的时候,通常都是用EJB的MDB(Message-driven bean). 这需要EJB容器的支持。springframework4 对JMS的支持 使得我们使用常规的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" />

总结

  1. 需要编写一个pojo来作为 监听器。这个 监听器可实现 MessageListener或者SessionAwareMessageListener 接口

  2. 如果不想实现接口 可以交给MessageListenerAdapter 这个适配器来管理。

  3. MDP 是需要注册到 spring 的 上下文 来管理的

  4. Spring 设定了 ListenerContainer 来管理监听器。所以说要实现 监听器,就必须声明一个或若干个ListenerCotainer


你可能感兴趣的:(SpringFramework4系列之SpringJMS:(四)异步接收消息 1.基本介绍)