首页 > 编程语言 > 详细

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

时间:2015-07-07 13:18:02      阅读:275      评论:0      收藏:0      [点我收藏+]

以往我们监听消息队列的时候,通常都是用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" />

总结

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

  2. 如果不想显示的实现接口 可以交给MessageListenerAdapter 来托管

  3. MDP 是需要注册到 spring 的 beans中 来管理的

  4. Spring 设定了 ListenerContainer 来管理监听器 使得监听器能够很好的工作


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

原文:http://my.oschina.net/u/1041012/blog/475593

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!