热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

javarabbitmq错误监听_SpringBoot集成RabbitMQ实战

SpringBoot集成RabbitMQ实战一、RabbitMQ简介RabbitMQ是基于Erlang语言开发的消息队列中间件系统,主要用来解决数据实时同步和响应问题
Spring Boot集成Rabbit MQ实战

一、Rabbit MQ简介

Rabbit MQ是基于Erlang语言开发的消息队列中间件系统,主要用来解决数据实时同步和响应问题。消息中间件产品比较常见的有ActiveMQ、Kafka、Rabbit MQ、RocketMQ等等。Rabbit MQ的优势是通过交换机绑定队列,消息支持持久化,服务器宕机消息仍然存在。并且Rabbit MQ支持ACK确认机制,消费确认,也支持分布式事务。

二、应用场景

Rabbit MQ支持多种语言客户端,比如C、Ruby、Java、Python、C#、PHP等主流语言。笔者曾经做过消息中转推送中心,基于Rabbit MQ的一个二次开发,将微信推送消息、短信平台、语音消息、邮件等消息推送封装在消息中心,通过Rabbit MQ开放接口,其他系统只需要按照接口协议封装实体类发送JSON数据,消息中心就能推送微信、短信、语音、邮件给用户,并且具有重试机制,不成功的消息记录到消息日志表中。

三、主要组件

虚拟主机:RabbitMQ支持权限控制,但是最小控制粒度为虚拟主机。一个虚拟主机可以包含多个交换机、队列、绑定。

交换机:交换机用来绑定队列,用于消息中间权限控制。

队列:队列用来存放消息,原理基于数据结构里面的队列。

然后通过将交换机和队列绑定在一起从而组成消息广播、消息存储与发送。

四、Spring Boot与Rabbit MQ整合搭建

新建一个Maven工程,与Spring Boot整合的Rabbit MQ在pom.xml中的配置为:

org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-amqp org.springframework.boot spring-boot-starter-test test

在src/main/resources目录下新建application.yml指定项目端口号与连接Rabbit MQ配置,如下:

#访问端口server: port: 8482spring: application: name: ocai-core-rabbitmq session: store-type: none rabbitmq: host: 127.0.0.1 port: 5672 username: guest password: guest

新建com.ocai.core.mq.model包,在该包下新建实体User,代码为:

16cd5838f0a5fc65635734c05ad748d5.png

新建com.hxdi.core.mq.rabbit包,包下新建RabbitConfig.java进行绑定队列,注意注解@Configuration

d1aa736246cf8390aefcf6b71da25a3a.png

新建com.ocai.core.mq.rabbit.hello包,包下新建消息发送Bean组件,如图

e8ff703820fd8c392561e3d88ea5ab9b.png

建立队列监听者,@RabbitListener(queues = "hello")表示监听hello这个队列

9f10a86e400c974c3d67cd4e681bc9d7.png

新建Junit测试工具类,通过调用HelloSender发送消息,如图

3623bb540bd8d7bf3705dbf9a26646c9.png

右键HelloTest运行测试工具,查看控制台结果

1c22fd54e22594c1b5314791c338715d.png

结果Sender为发送消息,Receiver为接收消息。

五、发送对象消息

新建ObjectSender,消息发送者,如图

4ec7c67efda0fe7a9b5a17ab4a5cc060.png

新建ObjectReceiver绑定队列queues = "object"监听器,接收消息

f4101522c9310f36a274bc3cb62c365f.png

新建Junit Test

7810d3c7d5977c5e9b851d8d2e045cff.png

运行之后查看控制台

c4f7638dcdbc94c14eae5a3e96d1e5f0.png

接收对象

六、建立Topic交换机队列

建立TopicRabbitConfig.java,建立队列

6627acf2a09bc76cebe9c93b260e3ae8.png

建立交换机

db5dfd1392055f0cd6317c6701e581b2.png

绑定交换机与队列并指定路由键

fd952b9ae021d84337690c071fc6b6c0.png

指定队列Sender,匹配topic.#路由键,并指定交换机topicExchange

0ba6ebb3b0be0b33bcc8775819ed6f91.png

匹配topic.message路由键

a6704f09c4dd5466c06f783350b8111b.png

匹配topic.#路由键

ec050eef5d3d0f978eec9171d489bb11.png

接收队列queues = "topic.message"

80f765349da69b90b74863bf13196b4a.png

接收队列queues = "topic.messages"

0ba1a8c6f766994fd39c40818f2b3fd9.png

建立Junit,代码如下:

95253a31291dd698c174e208309899fb.png

运行topic查看队列接收情况

4b3da8f7a2c1beeec362d215fa6b25f0.png

由于绑定关系

b3d9abf3f7482ebd5a05dea649f885f9.png

因此是topic.messages这个队列接收到消息

5b77208616263478e613b1bb57d07874.png

回到Junit运行

a16a41f1a07ae3c025c20f94179959bd.png

运行结果

a2dfeafb109d5982931da1b4ca464f4d.png

可以看到queues = "topic.message"和queues = "topic.messages"这2个队列都收到了消息。

因为绑定关系

94f554e2032cff4825b48311dd53f405.png

而发送者

bb5d0285043234e2c19b72bc0142794f.png

对于这2个路由键都符合

返回Junit运行

f8065fee88b5bc174ec5adc85749527d.png

运行结果

3c6a0ec62d2caf78a2eeb5ef8369b695.png

因为发送者

71bdf69824bd12ddd0de8fe842a860ba.png

topic.messages只匹配

5a6fae84a163611355b945d442b00482.png

这个路由键,也就是

254d941c6c671e811d22f0d6d705f0c8.png

这个队列

七、Fanout广播

广播FanoutRabbitConfig代码如下:

import org.springframework.amqp.core.Binding;import org.springframework.amqp.core.BindingBuilder;import org.springframework.amqp.core.FanoutExchange;import org.springframework.amqp.core.Queue;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class FanoutRabbitConfig { @Bean public Queue AMessage() { return new Queue("fanout.A"); } @Bean public Queue BMessage() { return new Queue("fanout.B"); } @Bean public Queue CMessage() { return new Queue("fanout.C"); } @Bean FanoutExchange fanoutExchange() { return new FanoutExchange("fanoutExchange"); } @Bean Binding bindingExchangeA(Queue AMessage, FanoutExchange fanoutExchange) { return BindingBuilder.bind(AMessage).to(fanoutExchange); } @Bean Binding bindingExchangeB(Queue BMessage, FanoutExchange fanoutExchange) { return BindingBuilder.bind(BMessage).to(fanoutExchange); } @Bean Binding bindingExchangeC(Queue CMessage, FanoutExchange fanoutExchange) { return BindingBuilder.bind(CMessage).to(fanoutExchange); }

广播交换机fanoutExchange绑定了3个队列

队列1:

5244059822061b94eef5fd7f4b80257e.png

队列2:

3570eeb16ee20f7ad54116a474f2eb5e.png

队列3:

0075db01ca7ae3910711d1f67b349b4c.png

队列发送者,广播交换机:

1d655f97ba5a0a04030d995103ce6613.png

Junit工具如下

5158e3df567643768804722b7bdc78ff.png

运行Junit

8e24e2a8935e03b7b786cf1950188d32.png

可以看到广播交换机的3个队列都接收到了消息

八、Many队列

队列监听多次

接收者1:

75f77fe69e9b684cc0c6a499cb224dd5.png

接收者2:

6794b4dc3fc0a1c9312c8537dd6407e9.png

发送者1:

1f27c47115ab927cd4344ad91cd98361.png

发送者2:

bf06cdd4362ea4a0d8e63a8268bf382a.png

新建Junit:

a1016d55d71f03112c76290b259e19b2.png

运行manyToMany

5ccff725dbfd8ef995ebaad0db0126bf.png

可以看到队列交错运行,同一个队列对应关系Many To Many

以上就是分享的Spring Boot集成RabbitMQ实战,有机会分享一下自己的消息中转推送中心系统。



推荐阅读
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • POCOCLibraies属于功能广泛、轻量级别的开源框架库,它拥有媲美Boost库的功能以及较小的体积广泛应用在物联网平台、工业自动化等领域。POCOCLibrai ... [详细]
  • 1、概述首先和大家一起回顾一下Java消息服务,在我之前的博客《Java消息队列-JMS概述》中,我为大家分析了:然后在另一篇博客《Java消息队列-ActiveMq实战》中 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • CentOs 7.3中搭建RabbitMQ 3.6单机多实例服务的步骤与使用
    CentOs7.3中搭建RabbitMQ3.6单机多实例服务的步骤与使用-RabbitMQ简介RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
  • 开发笔记:Python之路第一篇:初识Python
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Python之路第一篇:初识Python相关的知识,希望对你有一定的参考价值。Python简介& ... [详细]
  • Allegro总结:1.防焊层(SolderMask):又称绿油层,PCB非布线层,用于制成丝网印板,将不需要焊接的地方涂上防焊剂.在防焊层上预留的焊盘大小要比实际的焊盘大一些,其差值一般 ... [详细]
  • Hadoop——Hive简介和环境配置
    一、Hive的简介和配置1.简介Hive是构建在Hadoop之上的数据操作平台lHive是一个SQL解析引擎,它将SQL转译成MapReduce作业,并 ... [详细]
  • 近期看见一篇来自Intel的很有意思的分析文章,作者提到在他向45名与会的各公司程序员开发经理战略师提问“什么是实施并行编程的最大障碍”时,下面五个因素 ... [详细]
  • 分布式消息_58分布式消息队列WMB设计与实践
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了58分布式消息队列WMB设计与实践相关的知识,希望对你有一定的参考价值。 ... [详细]
author-avatar
看人不顺眼说明6自己没教养
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有