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

以往我们监听消息队列的时候,通常都是用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 来管理监听器 使得监听器能够很好的工作
时间: 2024-08-14 14:46:56

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

SpringFramework4系列之SpringJMS:(四)异步接收消息 2.构建监听器

构建实现接口的监听器 编写监听器类并且实现监听器接口 public class ListenerDemo implements MessageListener {     public void onMessage(Message message) {         System.out.println(message.toString());     } } 注册MDP <!-- this is the Message Driven POJO (MDP) --> <bean id=&

Chrome浏览器扩展开发系列之十四:本地消息机制Native messagin

Chrome浏览器扩展开发系列之十四:本地消息机制Native messaging 2016-11-24 09:36 114人阅读 评论(0) 收藏 举报  分类: PPAPI(27)  通过将浏览器所在客户端的本地应用注册为Chrome浏览器扩展的"本地消息主机(native messaging host)",Chrome浏览器扩展还可以与客户端本地应用之间收发消息. 客户端的本地应用注册为Chrome浏览器扩展的"本地消息主机"之后,Chrome浏览器会在独立的

C# Socket基础(二) 之 服务器异步接收消息

ManualResetEvent reviceManager = new ManualResetEvent(false); 1 public void args_Completed(object sender, SocketAsyncEventArgs e) 2 { 3 //监听完成客户端的请求,一但监听到返回新的套接字 4 var clientSocket = e.AcceptSocket; 5 //启动线程获取客户端发来的消息 6 if (clientSocket == null) retu

SpringFramework4系列之SpringJMS:(五)Jms namespace的使用

Spring jms 的命名空间 xmlns:jms="  xsi:schemaLocation=" http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms.xsd" Spring jms 的命名空间元素 SpringJMS 提供了 三种 命名空间元素 <jms:annotation-drive> <jms:listener-

Chrome浏览器扩展开发系列之十四:本地消息机制Native messaging

通过将浏览器所在客户端的本地应用注册为Chrome浏览器扩展的“本地消息主机(native messaging host)”,Chrome浏览器扩展还可以与客户端本地应用之间收发消息. 客户端的本地应用注册为Chrome浏览器扩展的“本地消息主机”之后,Chrome浏览器会在独立的进程中启动该本地应用,并通过标准输入/输出流(stdin/stdout)进行消息通信. 1)      本地应用的配置文件的内容 本地应用要能够成为“本地消息主机”,必须有一个manifest.json配置文件(文件名

消息队列技术终结者(四)—消息消费者以何种方式接收消息

消息消费者可以同步接收消息,也可以异步接收消息,一般而言,采用异步的方式接受消息优于采用同步的方式接受消息,体现在:        1.异步方式创建的网络流量比较小,单向推送消息并使之通过管道进入消息监听器.管道操作支持将多条消息聚合为一个网络调用.        2.异步方式使用线程比较少.异步方式在消息接收者不活动期间不使用线程.同步方式的消息接收者在接收调用期间内使用线程,结果线程可能会长时间保持空闲,尤其是该调用中指定了阻塞超时.        3.使用异步方式可以规避阻塞服务器上运行的

Chrome浏览器扩展开发系列之十四

Chrome浏览器扩展开发系列之十四:本地消息机制Native messaging 时间:2015-10-08 16:17:59      阅读:1361      评论:0      收藏:0      [点我收藏+] 通过将浏览器所在客户端的本地应用注册为Chrome浏览器扩展的"本地消息主机(native messaging host)",Chrome浏览器扩展还可以与客户端本地应用之间收发消息. 客户端的本地应用注册为Chrome浏览器扩展的"本地消息主机"

Java常用消息队列原理介绍及性能对比

消息队列使用场景 为什么会需要消息队列(MQ)? 解耦  在项目启动之初来预测将来项目会碰到什么需求,是极其困难的.消息系统在处理过程中间插入了一个隐含的.基于数据的接口层,两边的处理过程都要实现这一接口.这允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 冗余  有些情况下,处理数据的过程会失败.除非数据被持久化,否则将造成丢失.消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险.许多消息队列所采用的"插入-获取-删除"范式中,在把一

【iOS开发每日小笔记(四)】iOS 7中如何除去UIAlertView 规避delegate对象销毁后接收消息的crash

这篇文章是我的[iOS开发每日小笔记]系列中的一片,记录的是今天在开发工作中遇到的,可以用很短的文章或很小的demo演示解释出来的小心得小技巧.该分类的文章,内容涉及的知识点可能是很简单的.或是用很短代码片段就能实现的,但在我看来它们可能会给用户体验.代码效率得到一些提升,或是之前自己没有接触过的技术,很开心的学到了,放在这里得瑟一下.其实,90%的作用是帮助自己回顾.记忆.复习.如果看官觉得太easy,太碎片,则可以有两个选择:1,移步[iOS探究]分类,对那里的文章进行斧正:2,在本文的评论