Spring集成RabbitMQ如何实现监听多主机下的多个队列
问题结论
现有配置无法实现监听多个不同RabbitMQ主机下的多个不同队列。
原因说明
你给出的是单RabbitMQ实例的配置结构:
event.rabbit: host: {{ params.app_properties.mq_host }} port: {{ params.app_properties.mq_port }} username: ${mq_username} password: ${mq_password} virtual-host: {{ params.app_properties.mq_vhost }} exchange.name: {{ params.app_properties.mq_exchange }} queue.name: {{ params.app_properties.event_rabbit_queue_name}}
整套配置只能关联唯一一个RabbitMQ服务节点/集群,一套主机、端口、鉴权信息只能建立一个连接池,自然没法同时连多个不同主机的RabbitMQ,也没法绑定多个不同实例下的队列。
实现多主机多队列监听的调整方案
- 第一步:调整YML配置为多实例列表结构
event.rabbit.instances: # 第一个RabbitMQ实例配置 - host: {{ params.app_properties.mq1_host }} port: {{ params.app_properties.mq1_port }} username: ${mq1_username} password: ${mq1_password} virtual-host: {{ params.app_properties.mq1_vhost }} exchange.name: {{ params.app_properties.mq1_exchange }} queue.name: {{ params.app_properties.event_rabbit_queue1_name}} # 第二个RabbitMQ实例配置,需要加更多实例按同格式追加即可 - host: {{ params.app_properties.mq2_host }} port: {{ params.app_properties.mq2_port }} username: ${mq2_username} password: ${mq2_password} virtual-host: {{ params.app_properties.mq2_vhost }} exchange.name: {{ params.app_properties.mq2_exchange }} queue.name: {{ params.app_properties.event_rabbit_queue2_name}}
- 第二步:修改Spring代码适配多实例
Spring Boot默认的RabbitMQ自动配置只支持单实例,你需要自行编写配置类:- 读取上述多实例配置列表
- 为每个实例单独创建独立的
ConnectionFactory连接工厂 - 为每个连接工厂单独创建对应的
RabbitListenerContainerFactory监听容器工厂 - 编写队列监听器时,通过
@RabbitListener注解的containerFactory属性指定对应的容器工厂,即可绑定不同RabbitMQ实例下的队列。
内容的提问来源于stack exchange,提问作者Maksym Rybalkin
相关产品推荐
相关产品推荐

