RabbitMQ中动态创建队列和监听

一。背景

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

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

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

二。解决方案

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

upload successful

1.开发环境

  • jdk 8 ;
  • idea;
  • rabbitmq 3.7.16;

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

2.1 引入依赖

 
  1. <!-- rabbitmq -->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-amqp</artifactId>
  5. <version>2.1.7.RELEASE</version>
  6. </dependency>

2.2 配置rabbitmq

添加 rabbitmq配置

upload successful

upload successful

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

upload successful
说明:

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

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

upload successful

upload successful

说明:

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

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

3.1 引入依赖:

 
  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-amqp</artifactId>
  4. <version>2.1.7.RELEASE</version>
  5. </dependency>
  6. <!-- lombok -->
  7. <dependency>
  8. <groupId>org.projectlombok</groupId>
  9. <artifactId>lombok</artifactId>
  10. <optional>true</optional>
  11. <version>1.18.2</version>
  12. </dependency>
  13. <!-- 单元测试 -->
  14. <dependency>
  15. <groupId>org.springframework.boot</groupId>
  16. <artifactId>spring-boot-starter-test</artifactId>
  17. <version>2.1.5.RELEASE</version>
  18. </dependency>
  19. <dependency>
  20. <groupId>org.apache.httpcomponents</groupId>
  21. <artifactId>httpclient</artifactId>
  22. <version>4.5.9</version>
  23. </dependency>
  24. <dependency>
  25. <groupId>com.squareup.okhttp3</groupId>
  26. <artifactId>okhttp</artifactId>
  27. <version>3.10.0</version>
  28. </dependency>

3.2 配置rabbitmq

upload successful

upload successful

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

upload successful

4.重点说明

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

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

upload successful

4.2 如何动态创建队列

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

upload successful

4.3 如何动态地创建监听

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

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

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

4.4 SimpleMessageListenerContainer 的作用

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

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

upload successful

upload successful

三。源代码

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

链接:https://pan.baidu.com/s/1k_5EAnBmEyfc_QOH0uKSywicon-default.png?t=M85Bhttps://pan.baidu.com/s/1k_5EAnBmEyfc_QOH0uKSyw

提取码:0ka5

  • 12
    点赞
  • 93
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
RabbitMQ队列监听器是用于在RabbitMQ监听队列的组件。它可以动态地创建队列,并将队列放入监听,以便实时接收并处理队列的消息。 在Java,可以使用SimpleMessageListenerContainer类来创建和管理RabbitMQ队列监听器。这个类负责监听队列的添加、移除等操作。它是RabbitMQ专门用于监听队列的组件。 要使用SimpleMessageListenerContainer类创建队列监听器,首先需要使用@Autowired和@Qualifier注解将RabbitAdmin和SimpleMessageListenerContainer类注入到代码。然后,可以使用RabbitAdmin的方法来创建队列并将其绑定到交换机上。最后,使用SimpleMessageListenerContainer的方法将队列添加到监听并启动监听器。这样,就可以实现对队列消息的监听和处理了。 另外,在一些配置类,例如RabbitBootstrapConfiguration类,可以定义RabbitListenerEndpointRegistry bean来进行监听容器的注册操作。这个bean负责管理和注册RabbitMQ监听器的相关操作。通过定义这个bean,可以更方便地管理和配置RabbitMQ队列监听器。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [springBoot整合rabbitMQ动态创建队列,动态监听。(三)](https://blog.csdn.net/web15085181368/article/details/124077397)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [springboot-rabbitmq 实现动态配置监听容器](https://blog.csdn.net/m0_46978151/article/details/124875003)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值