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,保存下记忆。
项目目录结构如下:

RabbitMQ中动态创建队列和监听_第1张图片

1.开发环境

  • jdk 8 ;
  • idea;
  • rabbitmq 3.7.16;

2. producer,生产者:动态创建队列

2.1 引入依赖

 
  1. org.springframework.boot
  2. spring-boot-starter-amqp
  3. 2.1.7.RELEASE

2.2 配置rabbitmq

添加 rabbitmq配置

RabbitMQ中动态创建队列和监听_第2张图片

RabbitMQ中动态创建队列和监听_第3张图片

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

RabbitMQ中动态创建队列和监听_第4张图片
说明:

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

2.4 新增队列之后处理的内容

RabbitMQ中动态创建队列和监听_第5张图片

RabbitMQ中动态创建队列和监听_第6张图片

说明:

  • 1.生产者在创建了新的队列之后,会通过调用restful接口的形式调用消费者中开放的接口,该接口的作用是新增监听。
  • 2.这里的这种方式,在微服务中,可以通过feign去调用。feign正是微服务中,项目内部模块间进行通信的手段。这里只是采用OkHttp进行了模仿。

3.consumer ,消费者:动态创建队列的监听

3.1 引入依赖:

 
  1. org.springframework.boot
  2. spring-boot-starter-amqp
  3. 2.1.7.RELEASE
  4.  
  5. org.projectlombok
  6. lombok
  7. true
  8. 1.18.2
  9.  
  10. org.springframework.boot
  11. spring-boot-starter-test
  12. 2.1.5.RELEASE
  13. org.apache.httpcomponents
  14. httpclient
  15. 4.5.9
  16. com.squareup.okhttp3
  17. okhttp
  18. 3.10.0

3.2 配置rabbitmq

RabbitMQ中动态创建队列和监听_第7张图片

RabbitMQ中动态创建队列和监听_第8张图片

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

RabbitMQ中动态创建队列和监听_第9张图片

4.重点说明

4.1 如何获取rabbitmq中有哪些队列

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

RabbitMQ中动态创建队列和监听_第10张图片

4.2 如何动态创建队列

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

upload successful

4.3 如何动态地创建监听

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

RabbitMQ中动态创建队列和监听_第11张图片
第二步,在被生产者调用时,重新查询一边队列列表,判断列表中 新的队列是否已经生成,如果已经生成,则将新的队列添加到监听容器中。

RabbitMQ中动态创建队列和监听_第12张图片
第二步是重点,这里rabbitmq会先把所有的消费者清空,然后重新加入所有的监听对应的消费者。

4.4 SimpleMessageListenerContainer 的作用

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

RabbitMQ中动态创建队列和监听_第13张图片
listener 与 消费者的关系:每个listener可以配置多个消费者,像上面这样设置,那么每个listener就配置了100个消费者。一般一个队列只设置一个监听。像本demo中,共有5个队列,5个监听,那么就有500个消费者。

RabbitMQ中动态创建队列和监听_第14张图片

RabbitMQ中动态创建队列和监听_第15张图片

三。源代码

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

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

提取码:0ka5

你可能感兴趣的:(JAVA,rabbitmq)