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);
    }
}
复制代码

 

posted @   官萧何  阅读(995)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示