为什么80%的码农都做不了架构师?>>>   

上篇讲了RabbitMQ连接工厂的作用是用来创建RabbitMQ的连接,本篇就来讲讲RabbitMQ的发送消息。通过RabbitMQ发送消息最简单的方式就是将connectionFactory Bean注入到服务层类中,并使用它创建Connection,使用这个Connection来创建Channel,再使用这个Channel发布消息到Exchange中。

当然Spring AMQP提供了RabbitTemplate来简便我们的操作,消除RabbitMQ发送和接收消息相关的样板代码。使用RabbitTemplate也是先在配置文件中写相关的配置,使用Rabbit命名空间的<template>元素,如下:

<template id="rabbitTemplate" connection-factory="connectionFactory">

现在要发送消息只需要将模板bean注入到服务层类中(这里以SendServiceImpl为例),并使用它来发送Spittle,使用RabbitTemplate来发送Spittle提醒,代码如下:

public class SendServiceImpl implements SendService {private RabbitTemplate rabbit;@Autowiredpublic SendServiceImpl (RabbitTemplate rabbit) {this.rabbit = rabbit;}public void sendSpittle (Spittle spittle) {rabbit.convertAndSend("spittle.test.exchange", "spittle.test", spittle);}
}

上面代码中sendSpittle()调用RabbitTemplate的convertAndSend()方法,传入的三个参数分别是Exchange的名称、routing key以及要发送的对象。
这里如果使用最简单的只传要发送的对象的重载方法,RabbitTemplate就使用默认的Exchange和routing key。按之前配置的话,这两项默认都为空,也可以自行在<template>元素上借助exchange和routing-key属性配置不同的默认值:

<template id="rabbitTemplate" connection-factory="connectionFactory"exchange="spittle.test.exchange" routing-key="spittle.test" />

此外RabbitTemplate还有其他方法可以用来发送消息,比如用send()方法来发送org.springframework.amqp.core.Message对象,如下所示:

Message message = new Message("Hello World".getBytes(), new MessageProperties());
rabbit.send("hello.exchange", "hello.routing", message);

使用send()方法的技巧在于构造要发送的Message对象,在上面的例子中,通过给定字符串的字节数组来构建Message实例。这里是字符串相对比较简单,如果消息是复杂对象的话,则会比较复杂。也是因为这样,所以一般会用convertAndSend()方法,它会自动将对象转换为Message,不过它需要一个消息转换器来帮助完成该任务,默认的转换器是SimpleMessageConverter,它适用于String、Serializable实例和字节数组。

发送消息完后,接下来就是接收消息了。
在传统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属性来指定要监听的队列,这里只设定了一个要监听的队列,如果要设置多个队列的话,用逗号隔开。到这里消息接收就完成了,拿到消息后就可以在相应方法里执行相应处理了,使用AMQP发送接收消息就讲解到此了。

转载于:https://my.oschina.net/hin911/blog/862645

【Spring】使用Spring和AMQP发送接收消息(下)相关推荐

  1. ActiveMQ 部署及发送接收消息

    ActiveMQ 部署及发送接收消息 一.           下载 下载地址:http://activemq.apache.org/ 我这里使用的版本为当前最新5.8.0. 下载版本有Windows ...

  2. c#UDP发送接收消息

    UDP作为一种简单的.面向数据报的无连接的协议,虽然提供的是不可靠的服务,但是从速度上.一对多传输方面比TCP有着很大的优势.本文主要讲解UDP信息的发送和接收. Demo界面图如下: 首先打开程序e ...

  3. JavaWeb聊天(Redis+环信) 一、发送接收消息、聊天记录拉取

    公司有需求做一个聊天功能. APP端,跟网页端互相聊天 android端直接嵌入了环信提供的DEMO.聊天记录.都是存储在本地自己进行维护. 所以本次只需要维护网页端的聊天记录~还有接收发送的消息就好 ...

  4. 韩顺平Java:qq项目离线发送接收消息/文件扩展

    思路:1.在服务端创建一个ConcurrentHashMap线程安全的集合用来存储离线用户的消息和文件,为了实现每个用户可以保存多条离线消息,我们在键值对value中采用ArrayList来保存多条m ...

  5. html消息发送接收,在html页面中 如何应用mqtt协议发送/接收消息

    经过前面几篇文章的介绍,在很多场景下利用NodeMCU加持mqtt协议来控制几乎所有需要传感器监控的行业都能极大地简化物联的成本.在这样一个基础上,还能拓展出很多好玩的.实际运用的甚至能够作为商业化运 ...

  6. 怎样用python模拟微信扫码登录_十一、模拟扫码登录微信(用Django简单的布置了下页面)发送接收消息...

    importreimporttimeimportjsonimportrequestsfrom bs4 importBeautifulSoupfrom django.shortcuts importre ...

  7. C#-发送接收消息MQ

    项目需要接收到MQ推送消息,记录一下 链接:https://pan.baidu.com/s/1ggMbysb 密码:nuwh 转载于:https://www.cnblogs.com/nanxiuyon ...

  8. 转载的spring cloud的全家桶,有空学习下

    Spring Cloud Config:配置管理开发工具包,可以让你把配置放到远程服务器,目前支持本地存储.Git以及Subversion. Spring Cloud Bus:事件.消息总线,用于在集 ...

  9. (三)java版spring cloud+spring boot 社交电子商务平台 - Spring Cloud集成项目简介

    2019独角兽企业重金招聘Python工程师标准>>> 电子商务平台源码请加企鹅求求:一零三八七七四六二六.Spring Cloud集成项目有很多,下面我们列举一下和Spring C ...

最新文章

  1. Linux的绝对路径和相对路径
  2. JQuery UI - droppable (转载)
  3. 绝地求生自定义服务器租用,绝地求生自定义服务器怎么开 自定义服务器设置方法...
  4. 【工作总结】C++ string工具类
  5. 解析性语言与编译性语言优劣对比
  6. Echarts实现环形图的渐变颜色效果
  7. 第三十三期:连接池中非常关键的两个参数,到底是干啥用的?
  8. 程序员成熟的标志《程序员成长路线图:从入门到优秀》
  9. Docker学习总结之docker入门(转自:Vikings翻译)
  10. 平均无故障时间100万小时_无故障运行时间MTBF投标要求GB5080.7-中检
  11. Rational Rose打开mdl文件显示“there are warning,see the log for details”问题解决方法
  12. Whitebox 白盒--密码算法的安全工具
  13. 2021年6月23日,我们毕业啦!!!
  14. MAC小技巧|Mac屏幕截图去除窗口阴影
  15. python乒乓球比赛规则_使用Python进行体育竞技分析(预测球队成绩)
  16. php-screw 安装,php源码加密:php_screw 安装与使用
  17. python处理复杂excel_python高手之路python处理excel文件(方法汇总)
  18. 像向日葵一样活着——想起了从幼稚园到现在的同桌们
  19. 音视频数据处理入门:AAC音频码流解析
  20. 音乐相册源码php,分享使用JavaScript制作微信音乐相册实例

热门文章

  1. Spyder打开报错解决办法
  2. 二叉排序树(Binary Sort Tree) 又称为二叉查找树(Binary Search Tree) - (代码、分析)
  3. 汇编语言-013(DAS 、DAA与DAS、QWORD类型用SBB借位减法、编写指令将AX符号扩展到EAX,不能使用CWD、用SHR和条件判断指令将AL循环右移一位、SHLD、压缩十进制转换)
  4. python网络编程---TCP客户端
  5. 【转载】define与typedef区别与联系
  6. django contrib 包简介
  7. python之条件、循环语句
  8. Fire!——两个BFS
  9. Linux下基于socket和多线程的聊天室小程序
  10. 进程与线程的区别(面试题)