文档章节

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

Garrry
 Garrry
发布于 2015/07/07 21:34
字数 725
阅读 1137
收藏 4

在Spring中,构建监听器 有三种方式:

  1. 实现监听器接口

  2. 适配器托管

  3. 注解监听器

其中,实现接口和注解监听器 都需要一个监听器容器的支持。

构建实现接口的监听器

编写监听器类并且实现监听器接口

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="messageListener1" class="spring.jms.ListenerDemo" />

配置listenerContainerFactory

<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="connectionFactory" ref="cachingConnectionFactory"/>
    <property name="destination" ref="jmsDestination"/>
    <property name="messageListener" ref="messageListener1" />
</bean>

测试

先送message 到queue里面 具体参考SpringFramework4系列之SpringJMS:(一)搭建JMS

然后初始化Spring即可,非常简单

如果使用同一个spring config,发送message的时候 spring-config已经被初始化了,这个时候已经有监听器在工作了而无需再初始化化一次spring了

ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");

构建适配器托管的监听器

编写监听器类

无需实现接口,也无需注册到spring的上下文中

public class ListenerDemo2 {
    public void onMessage(Message message) {
        System.out.println(message.toString());
    }

配置适配器

<bean id="messageAdapter"
      class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
    <constructor-arg>
        <bean class="spring.jms.ListenerDemo2"/>
    </constructor-arg>
    <property name="defaultListenerMethod" value="onMessage"/>
</bean>

配置listenerContainerFactory

将适配器作为listener 配置到 container中

<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="connectionFactory" ref="cachingConnectionFactory"/>
    <property name="destination" ref="jmsDestination"/>
    <property name="messageListener" ref="messageAdapter" />
</bean>

测试

先送message 到queue里面 具体参考SpringFramework4系列之SpringJMS:(一)搭建JMS

然后初始化Spring即可,非常简单。

建议 发送message 和 监听器使用不同的spring config 来避免冲突。

如果使用同一个spring config,发送message的时候 spring-config已经被初始化了,这个时候已经有监听器在工作了而无需再初始化化一次spring了

ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");

构建注解监听器

编写监听器类

使用注解@componet 来声明这个是个组件类

使用注解@JmsListener 来声明这是个监听器方法,其中 destination 表示 监听的队列名字,而containerFactory则表示使用的ListenerContainerFactory的。

@Component("listenerDemo3")
public class ListenerDemo3 {
    @JmsListener(destination = "testQueue", containerFactory = "jmsListenerContainerFactory")
    public void receiveMessage(String message) {
        System.out.println("Received <" + message + ">");
    }
}

配置listenerContainerFactory

这个时候无需再定义监听器到监听器容器中啦。 这里笔者额外定义了属性 concurrency,表示同时会生成几个consumer。

具体的有spring 自动生成啦

<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="connectionFactory" ref="cachingConnectionFactory"/>
    <property name="destination" ref="jmsDestination"/>
    <property name="concurrency" value="3-10"/>
</bean>

配置JMS 驱动

在spring 的config文件,需要定义jms 注解驱动,它会把注解的监听器类自动放到监听器容器中,使它开始工作。

<jms:annotation-driven/>

这里笔者做过一个实验,在没有配置component-scan,监听器也可以工作的。 看来这个注解驱动应该会自动扫描@componet的注解符号。

<context:component-scan base-package="spring"/>


© 著作权归作者所有

Garrry
粉丝 27
博文 46
码字总数 48703
作品 0
浦东
技术主管
私信 提问
加载中

评论(2)

Garrry
Garrry 博主

引用来自“xjava”的评论

总感觉不连贯,
谢谢 宝贵意见 会加以改进
m
mzllon
总感觉不连贯,
SpringFramework4系列之SpringJMS:(四)异步接收消息 1.基本介绍

以往我们监听消息队列的时候,通常都是用EJB的MDB(Message-driven bean). 这需要EJB容器的支持。springframework4 对JMS的支持 使得我们使用常规的POJO就可以作为监听器 接收消息队列的信息...

Garrry
2015/07/07
314
0
【Spring Cloud】分布式必学springcloud(十二)——结合SpringCloud Stream 异步调用

一、前言 在上一篇博客中,小编向大家介绍了一下SpringCloud Stream,相信实践过的老铁们,肯定是能收发消息了。但是有一个问题,比如我的发送端,使用的是,会一直的向消息队列中发消息。在...

kisscatforever
2018/05/20
0
0
SpringFramework4系列之SpringJMS:(一)搭建JMS-注解加XML版

Maven dependency maven的dependency用着 隐形的依赖传递性,如果只是用到 JMS这部分功能 引用一下Maven坐标即可 <dependency> <groupId>org.springframework</groupId> <artifactId>spring......

Garrry
2015/07/06
3K
0
JMS(三):MessageListener

消息监听器(Message Listener) 消息监听器是一个充当消息的异步事件处理器的对象,它实现了MessageListener接口,这个接口只有一个方法onMessage,在这个方法里,你可以定义当接收到消息之...

牧羊人Berg
2016/03/02
210
0
消息中间件系列三、JMS和activeMQ的简单使用

一、JMS 1、什么是JMS   JMS(JAVA Message Service,java消息服务)本质是API,Java平台消息中间件的规范,java应用程序之间进行消息交换。并且通过提供标准的产生、发送、接收消息的接口简...

我巴巴
2018/10/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring使用ThreadPoolTaskExecutor自定义线程池及实现异步调用

多线程一直是工作或面试过程中的高频知识点,今天给大家分享一下使用 ThreadPoolTaskExecutor 来自定义线程池和实现异步调用多线程。 一、ThreadPoolTaskExecutor 本文采用 Executors 的工厂...

CREATE_17
今天
5
0
CSS盒子模型

CSS盒子模型 组成: content --> padding --> border --> margin 像现实生活中的快递: 物品 --> 填充物 --> 包装盒 --> 盒子与盒子之间的间距 content :width、height组成的 内容区域 padd......

studywin
今天
7
0
修复Win10下开始菜单、设置等系统软件无法打开的问题

因为各种各样的原因导致系统文件丢失、损坏、被修改,而造成win10的开始菜单、设置等系统软件无法打开的情况,可以尝试如下方法解决 此方法只在部分情况下有效,但值得一试 用Windows键+R打开...

locbytes
昨天
8
0
jquery 添加和删除节点

本文转载于:专业的前端网站➺jquery 添加和删除节点 // 增加一个三和一节点function addPanel() { // var newPanel = $('.my-panel').clone(true) var newPanel = $(".triple-panel-con......

前端老手
昨天
8
0
一、Django基础

一、web框架分类和wsgiref模块使用介绍 web框架的本质 socket服务端 与 浏览器的通信 socket服务端功能划分: 负责与浏览器收发消息(socket通信) --> wsgiref/uWsgi/gunicorn... 根据用户访问...

ZeroBit
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部