rabbitMq动态创建队列并监控

做个记录
原文地址:http://www.5ixiudou.com/2019/11/27/RabbitMQ%E4%B8%AD%E5%8A%A8%E6%80%81%E5%88%9B%E5%BB%BA%E9%98%9F%E5%88%97%E5%92%8C%E7%9B%91%E5%90%AC/

一。背景
在做某个微服务项目的时候,要和各个运输平台进行报文的对接,但是平台的个数和报文的种类个数不定。如果像平时RabbitMQ的简单应用那用,通过在producer的config文件中通过@Bean的方式创建交换机、队列、绑定,在consumer的config文件中通过@RabbitListener来添加监听,那么就会出现如下两个问题:

a.要写的相似代码太多。因为运输平台很多,最终可能有1000家左右,每个平台又有10个左右的报文,而且处理每个报文需要创建4个队列,那么就需要在producer和consumer中的config文件中写 4x10x1000个交换机、队列绑定、@Listener。即使做了代码优化,也需要大量的声明代码需要写。

b.拓展性不好。因为前期进行联调测试的时候,可能只有几家,但是慢慢地会有越来越多的平台接进来,那么每有一家接入的话,就需要改动代码,这样,改动地太频繁容易出现出错、不易于版本管理,而且对于已经联调通过的平台,可能会存在一些逻辑上的干扰。

二。解决方案
因为存在上面所说的问题,所以研究了下Rabbitmq中动态生成队列和动态创建监听的方法,并且实现了个demo,保存下记忆。
项目目录结构如下:

1.开发环境
jdk 8 ;
idea;
rabbitmq 3.7.16;
2. producer,生产者:动态创建队列
2.1 引入依赖
 
<!-- rabbitmq -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
<version>2.1.7.RELEASE</version>
</dependency>
2.2 配置rabbitmq
添加 rabbitmq配置

2.3 对外开放 API接口,用于新增队列

说明:

1.接口传入两个参数,第一个是队列的名字,第二个是要发送的消息。
2.当使用postman进行调用时,首先会判断rabbitmq中是否含有该队列,如果含有该队列,则直接把消息放入到队列中;如果不存在该队列,则先创建队列,然后把消息放入到队列中。
2.4 新增队列之后处理的内容


说明:

1.生产者在创建了新的队列之后,会通过调用restful接口的形式调用消费者中开放的接口,该接口的作用是新增监听。
2.这里的这种方式,在微服务中,可以通过feign去调用。feign正是微服务中,项目内部模块间进行通信的手段。这里只是采用OkHttp进行了模仿。
3.consumer ,消费者:动态创建队列的监听
3.1 引入依赖:
 
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
<version>2.1.7.RELEASE</version>
</dependency>
 
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
<version>1.18.2</version>
</dependency>
 
<!-- 单元测试 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.1.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.9</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.10.0</version>
</dependency>
3.2 配置rabbitmq


3.3 开放restful接口,用来动态添加监听,供 producer在创建队列后调用


4.重点说明
4.1 如何获取rabbitmq中有哪些队列
参考https://blog.csdn.net/qq_26656329/article/details/77404740
rabbitmq开放了一些方便的restful接口,提供给外部使用,来了解rabbitmq的动态,或者动态地在外部更改rabbitmq的内容。这里正是使用了rabbitmq的http接口来获取了队列列表,然后根据队列的列表来动态的创建监听

4.2 如何动态创建队列
是通过RabbitAdmin对象来动态地创建队列、交换机、绑定。

4.3 如何动态地创建监听
第一步,在配置消费者时,使用 SimpleMessageListenerContainer 这个监听容器类。设置好监听的基本的参数和当前已经存在的队列,然后放入到spring容器中。


第二步,在被生产者调用时,重新查询一边队列列表,判断列表中 新的队列是否已经生成,如果已经生成,则将新的队列添加到监听容器中。


第二步是重点,这里rabbitmq会先把所有的消费者清空,然后重新加入所有的监听对应的消费者。

4.4 SimpleMessageListenerContainer 的作用
SimpleMessageListenerContainer 提供了一个监听的容器,里边的设置是对每一个Listener的设置,
实际上与@RabbitListener的作用相同,参数也相同。


listener 与 消费者的关系:每个listener可以配置多个消费者,像上面这样设置,那么每个listener就配置了100个消费者。一般一个队列只设置一个监听。像本demo中,共有5个队列,5个监听,那么就有500个消费者。

三。源代码
源码已经上传到了百度云,可以下载运行

链接:https://pan.baidu.com/s/1k_5EAnBmEyfc_QOH0uKSyw

提取码:0ka5
————————————————
版权声明:本文为CSDN博主「天际流痕」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/tianjiliuhen/article/details/103287307

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值