做个记录
原文地址: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 引入依赖
2.2 配置rabbitmq
添加 rabbitmq配置
2.3 对外开放 API接口,用于新增队列
说明:
1.接口传入两个参数,第一个是队列的名字,第二个是要发送的消息。
2.当使用postman进行调用时,首先会判断rabbitmq中是否含有该队列,如果含有该队列,则直接把消息放入到队列中;如果不存在该队列,则先创建队列,然后把消息放入到队列中。
2.4 新增队列之后处理的内容
说明:
1.生产者在创建了新的队列之后,会通过调用restful接口的形式调用消费者中开放的接口,该接口的作用是新增监听。
2.这里的这种方式,在微服务中,可以通过feign去调用。feign正是微服务中,项目内部模块间进行通信的手段。这里只是采用OkHttp进行了模仿。
3.consumer ,消费者:动态创建队列的监听
3.1 引入依赖:
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