springboot整合rabbitMQ 一个队列绑定多个路由键 实现类似广播的效果&在监听时动态变更队列名称
1.mq队列绑定配置
以下是部分代码 (同一个队列绑定了两个不同的路由)
/** * TOPIC * @return */ @Bean("updateRealtimeIndexRecordQueue") public Queue updateRealtimeIndexRecordQueue() { // 构建队列名称 String name = RabbitConstants.UPDATE_REALTIME_INDEX_RECORD_QUEUE + "_" + HOST_ADDR; return QueueBuilder.durable(name).build(); } /** * 绑定队列 UPDATE_REALTIME_INDEX_RECORD_QUEUE 到TOPIC 交换机. * * @param queue the queue * @param taskExchange the topic exchange * @return the binding */ @Bean public Binding bindingUpdateRealtimeIndexRecordQueue(@Qualifier("updateRealtimeIndexRecordQueue") Queue queue, @Qualifier("taskExchange") TopicExchange taskExchange) { // 路由key String routinKey = RabbitConstants.UPDATE_REALTIME_INDEX_RECORD_QUEUE + ".#"; return BindingBuilder.bind(queue).to(taskExchange).with(routinKey); } /** * 绑定队列 UPDATE_REALTIME_INDEX_RECORD_QUEUE 到TOPIC 交换机. * * @param queue the queue * @param taskExchange the topic exchange * @return the binding */ @Bean public Binding bindingUpdateRealtimeIndexRecordQueue2(@Qualifier("updateRealtimeIndexRecordQueue") Queue queue, @Qualifier("taskExchange") TopicExchange taskExchange) { // 路由key String routinKey = RabbitConstants.UPDATE_REALTIME_INDEX_RECORD_QUEUE + "_" + HOST_ADDR; return BindingBuilder.bind(queue).to(taskExchange).with(routinKey); }
2.动态变更消费队列名称(继承ModifyMessageListenerContainer)
package com.gosun.health.service.vgs.mq.consumer; import com.alibaba.fastjson.JSONObject; import com.gosun.health.service.vgs.aop.annotation.LogAspect; import com.gosun.health.service.vgs.controller.DiskController; import com.gosun.health.service.vgs.controller.RecordingReplenishController; import com.gosun.health.service.vgs.mq.MyRabbitmqConfig; import com.gosun.health.services.common.rabbitmq.MessageReceive; import com.gosun.health.services.common.rabbitmq.ModifyMessageListenerContainer; import com.gosun.health.services.common.rabbitmq.RabbitConstants; import com.rabbitmq.client.Channel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.amqp.core.Message; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.io.IOException; import java.nio.charset.Charset; import java.util.Map; /** * * 描述: 获取更新实时索引任务 * * @author 官昌洪 * @date 2022/8/3 17:32 * @version V1.0 */ @Component public class UpdateRealTimeIndexRecordQueueConsumer extends ModifyMessageListenerContainer implements MessageReceive { private static final Logger log = LoggerFactory.getLogger(UpdateRealTimeIndexRecordQueueConsumer.class); @Autowired private RecordingReplenishController recordingReplenishController; @Override @LogAspect(value = "队列消息接收", type = "获取更新实时索引任务", paramNames = {"message"}) @RabbitListener(id = RabbitConstants.UPDATE_REALTIME_INDEX_RECORD_QUEUE) public void receive(Message message, Channel channel) { log.info("获取更新实时索引任务已下达到消费者!"); try { channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); // 提取消息体内容 String content = new String(message.getBody(), Charset.defaultCharset()); log.info("被消费的队列的消息内容: {}", content); // 业务 。。。 log.info("获取更新实时索引任务已完成!"); } catch (IOException e) { log.error("获取更新实时索引任务已下达到消费者异常: {}", e); } } @Override public void receive(Message message) { } @Override public void receive(byte[] content) { } @Override protected void modify() throws Exception { // 获取消息容器对象 SimpleMessageListenerContainer messageListenerContainer = (SimpleMessageListenerContainer) getMessageListenerContainer(); // 要修改的队列名称 messageListenerContainer.setQueueNames(RabbitConstants.UPDATE_REALTIME_INDEX_RECORD_QUEUE + "_" + MyRabbitmqConfig.HOST_ADDR); messageListenerContainer.setConcurrentConsumers(1); } @Override public void afterPropertiesSet() throws Exception { super.setContainerId(RabbitConstants.UPDATE_REALTIME_INDEX_RECORD_QUEUE); } }
⎛⎝官萧何⎠⎞一只快乐的爪哇程序猿;邮箱:1570608034@qq.com
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现