【Spring】使用Spring和AMQP发送接收消息(下)
上篇讲了使用RabbitMQ发送消息,本篇则来讲接收消息。
在传统JMS中有两种从队列获取信息的方式,使用JmsTemplate的同步方式以及使用消息驱动pojo的异步方式。Spring AMQP也提供了类似的方式来获取通过AMQP发送的消息。
使用RabbitTemplate来接收消息
RabbitTemplate提供的接收信息的方法中最简单的就是receive()方法,通过该方法就可以从队列中获取一个Message对象:
Message message = rabbit.receive("spittle.test.queue");
或者也可以通过配置获取消息的默认队列,这是通过在配置模板的时候,设置queue属性实现的:
<template id="rabbitTemplate"
connection-factory="connectionFactory"
exchange="spittle.test.exchange"
routing-key="spittle.test"
queue="spittle.test.queue" />
这样的话,在调用receive()方法时,不需要设置任何参数就能从默认队列中获取消息:
Message message = rabbit.receive( );
获取到Message对象后,一般需要将它的body属性中的字节数组转换为想要的对象,就像在发送的时候将领域对象转换为Message一样,将接收到的Message转换为领域对象也很繁琐。这里可以考虑使用RabbitTemplate的receiveAndConvert()方法作为替代方案:
Spittle spittle = (Spittle) rabbit.receiveAndConvert("spittle.test.queue");
receiveAndConvert()方法会使用与sendAndConvert()方法相同的消息转换器,将Message对象转换为原始的类型。
调用receive()和receiveAndConvert()方法都会立即返回,如果队列中没有等待的消息,将会得到null。这时一般需要程序员自己管理轮询以及必要的线程,实现队列监控。如果不想每次都同步轮询等待消息到达,可以使用Spring AMQP提供的消息驱动pojo,下面就看看使用消息驱动pojo的方式来接收消息。
使用消息驱动pojo来接收消息
如果想要在消息驱动pojo中异步地消费使用Spittle对象,先要解决这个pojo本身,如下的SpittleTestHandler扮演了这个角色:
public class SpittleTestHandler {
public void handleSpittleTest (Spittle spittle) {
...
}
}
其实这个类并没有依赖于AMQP,不管通过什么机制传递过来Spittle对象,它都能够处理。
这里还需要在Spring应用上下文中将SpittleTestHandler声明为一个bean:
<bean id="spittleListener"
class="com.***.spittr.test.SpittleTestHandler">
最后要声明一个监听器容器和监听器,当消息到达的时候,能够调用SpittleTestHandler,配置如下:
<listener-container connection-factory="connectionFactory">
<listener ref="spittleListener"
method="handleSpittleTest"
queue-names="spittle.test.queue" />
</listener-container>
上面的<listener-container>与<listener>元素都来自rabbit命名空间。并通过queue-names属性来指定要监听的队列,这里只设定了一个要监听的队列,如果要设置多个队列的话,用逗号隔开。到这里消息接收就完成了,拿到消息后就可以在相应方法里执行相应处理了。
【Spring】使用Spring和AMQP发送接收消息(下)的更多相关文章
- 【Spring】使用Spring和AMQP发送接收消息(上)
讲AMQP之前,先讲下传统的JMS的消息模型,JMS中主要有三个参与者:消息的生产者.消费者.传递消息的通道(队列或者主题),两种消息模型如下:通道是队列: 通道是队列: 通道是主题: 在JMS中,虽 ...
- 【Spring】使用Spring和AMQP发送接收消息(中)
上篇讲了RabbitMQ连接工厂的作用是用来创建RabbitMQ的连接,本篇就来讲讲RabbitMQ的发送消息.通过RabbitMQ发送消息最简单的方式就是将connectionFactory Bea ...
- XMPP客户端开发(2)--发送接收消息
客户端连接上服务器并登录以后,可以发送.接收消息. 首先需要定义Chat,MessageListener和ChatMessageListener几个变量: private static Chat ch ...
- 十一、模拟扫码登录微信(用Django简单的布置了下页面)发送接收消息
为了能够模拟登陆QQ,并获取信息.对扫码登录微信进行了分析.简单的用了一下Django将获取的信息映射到页面上.(python3+pycharm) 主要过程就是: 1.获取二维码 2.扫码登录(有三种 ...
- 安装RabbitMq,写程序发送接收消息
1.安装Erlang和RabbitMq 在安装RabbitMq之前需要安装的Erlang(esl-erlang_22.0_windows_amd64.exe): https://pan.baidu.c ...
- GCM 发送接收消息 Message Client Server 服务器端,客户端
GCM 传递参数 最近用了很多时间做GCM,由于碰到很多问题,因此详细做一下记录,以方便各位网友,不用再走我的重复的路.不过我试了一下GCM在国内很不好用.假如开发国外的程序的话,用GCM倒是很不错的 ...
- python通过套接字来发送接收消息
案例如下: 1.启动一个服务端套接字服务 2.启动一个客户端套接字服务 3.客户端向服务端发送一个hello,服务端则回复一个word,并打印 参考地址:https://www.cnblogs.com ...
- kafka控制测试发送接收消息
kafaka,生产者:./kafka-console-producer.sh --broker-list localhost:9092 --topic testTopic 消费者:./kafka-co ...
- spring 和spring cloud 组成
spring 顶级项目:Spring IO platform:用于系统部署,是可集成的,构建现代化应用的版本平台,具体来说当你使用maven dependency引入spring jar包时它就在工作 ...
随机推荐
- 《高质量C++&C 编程指南》学习笔记
这本电子书是在国科大上课时候,老师在课件资源里边提供的.之所以会重视这个文件,是因为本科时候,有个老师提到过:那个学生遍的代码很整齐,看起来让人舒服,我就知道工大留不下他.因此,我就格外注意这件事,但 ...
- 让DIV随滚动条滚动
$(window).scroll(function(event){ //JQ监听滚动条 $('DIV').css("top", $(window).scrollTop ...
- 编码符_new88
begin#239B38F58D59E401465E1FEE0AFA7AE2DD920EB6645F4A2075C7ABBBE2141B925668C9D635D90DE884907F4E52F921 ...
- Javascript高级编程学习笔记(39)—— DOM(5)Comment
Comment类型 顾名思义,comment类型指的就是注释节点在HTML文档中的类型 也就是说平时我们在代码中的注释,在HTML解析的时候也会被解析为一类节点 让我们可以根据这些节点进行一系列的操作 ...
- python 实现wav的波形显示(时域和频域)
音频处理中,经常要看一下啊频域图是什么样子的,这里自己写了一个小程序,可以完美的同步显示时域和频域图,直接上代码: #wave data -xlxw #import import wave as we ...
- Kubernetes集群搭建之Etcd集群配置篇
介绍 etcd 是一个分布式一致性k-v存储系统,可用于服务注册发现与共享配置,具有以下优点. 简单 : 相比于晦涩难懂的paxos算法,etcd基于相对简单且易实现的raft算法实现一致性,并通过g ...
- ionic cordova platform add android Cordova failed to install plugin Error: ENOENT: no such file or directory AndroidManifest.xml
问题描述: 在ionic 项目中出现编译android 的时候 出现 Cordova failed to install plugin Error: ENOENT: no such file or ...
- VueJs(14)---理解Vuex
理解Vuex 一.Vuex 是什么? 首先我们来分析一种实际开发中用vue.js的场景,你有n个组件,当你改变一个组件数据的时候需要同时改变其它n个组件的数据,那么我想你可能会对 vue 组件之间的通 ...
- mysql 开发基础系列3 日期数据类型
日期类型 如果要用来表示年月日,通常用DATE 来表示. 如果要用来表示年月日时分秒,通常用DATETIME 表示. 如果只用来表示时分秒,通常用TIME 来表示. TIMESTAMP表示格式 :YY ...
- [java核心外篇]__Object类与对象类型的转型
前言 我们在之前的学习中提过很多次了,java是面向对象的,java的基础可以说是建立在类和对象上面的.然后我们又学到了类的继承,发现了在java类库中,类的继承是极为普遍的,一个类继承另一个类,就像 ...