动态控制rabbitmq中的消费者监听的启动和停止

引言:

在业务系统中,消息中间件常用于实现流量削峰、异步通信等场景中发挥重要作用,通过消息监听机制可实现数据的异步获取与处理;而实际业务中常需根据特定场景(如系统维护、下游服务异常等)动态暂停或启动消息监听,对此即需要通过动态控制消费的启动和停止。以下操作方可实现该功能

一、引入依赖

引入springboot web以及rabbitmq的依赖

复制代码
<!--springboot web -->
<dependency>
   <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!--springboot web -->
<dependency>
   <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

二、配置application.yaml 配置文件

复制代码
spring:
  rabbitmq:
    addresses: 1127.0.0.1:5672
    username: admin
    password: konne20211220@.+
    virtual-host: /

三、创建消费服务

复制代码
@Configuration
public class Consumer {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    //服务中运行的数量
    public int serverRunSite;

    Logger logger = LoggerFactory.getLogger(Consumer.class);

    /**
     * 消费rabbitmq 中 testConsumer 的数据,并设置手动确认消息
     *  testListener 是rabbitmq中的唯一id,不能重复
     */
    @RabbitListener(id = "testListener", queues = "testConsumer", ackMode = "MANUAL")
    public  void receiveMessage(String msg, @Header(AmqpHeaders.DELIVERY_TAG) long tag, Channel channel) {
        logger.info("收到方案新增信息:{}", msg);
        try {
            channel.basicAck(tag,false);
        } catch (Exception e) {
            logger.error("消息确认失败,msg:{}",msg);
        }

        int limitSize = 10;
        //服务限制的数量和服务当前运行的数量一致进行停止当前服务监听
        if(limitSize == serverRunSite){
            rabbitTemplate.convertAndSend("datasource_add", msg);
            logger.warn("当前服务消费数量已达上限,数据扔回队列");
        }else{
            //处理下游业务
        }
    }
}

四、实现rabbitmq的消费者启动和停止

复制代码
@RestController
public class UpdateStatusController {

    //获取到rabbitmq的注册器
    @Autowired
    private RabbitListenerEndpointRegistry rabbitListenerEndpointRegistry;

    /**
     * 更改状态
     * @param status 0 开启,1关闭
     */
    @GetMapping("updateStatus")
    private  void updateStatus(int status) {
        if(status == 0){
            this.startConsumption();
        }else{
            this.stopConsumption();
        }
    }
    /**
     * 通过rabbitListenerEndpointRegistry 根据唯一id获取container
     * 关闭监听
     */
    public void stopConsumption() {
        AbstractMessageListenerContainer container = (AbstractMessageListenerContainer) rabbitListenerEndpointRegistry.getListenerContainer("testListener");
        container.stop();

    }

    /**
     * 开启监听
     */
    public void startConsumption() {
        AbstractMessageListenerContainer container = (AbstractMessageListenerContainer) rabbitListenerEndpointRegistry.getListenerContainer("testListener");
        container.start();
    }

}

按照以上步骤,方可实现通过接口控制rabbitmq中的消费者 启动停止

相关推荐
JLWcai202510097 天前
铸造领域树脂砂轮|金利威多场景解决方案,20 + 配方覆盖全需求
mongodb·zookeeper·eureka·spark·rabbitmq·memcached·storm
风吹夏回7 天前
RabbitMQ 核心术语 + Python pika 方法完整讲解
分布式·python·rabbitmq
风吹夏回7 天前
RabbitMQ 三种模式入门:HelloWorld、WorkQueue、PubSub
分布式·rabbitmq·ruby
霸道流氓气质7 天前
分布式追踪与 RequestId 传播完全指南
分布式
cheems95277 天前
[RabbitMQ高级特性] 消息确认机制:从 Ready / Unacked 到 basicAck、basicReject、basicNack 的底层拆解
分布式·rabbitmq·ruby
枫华落尽7 天前
【Hadoop01-完全分布式运行模式】
分布式
隔壁阿布都7 天前
ShedLock 分布式定时任务锁框架介绍
spring boot·分布式
文艺倾年7 天前
【强化学习】数学推导专题,20W字总结(十五)
人工智能·分布式·大模型·强化学习·vibecoding
ACP广源盛139246256737 天前
GSV9001S@ACP#1080P 级视频处理芯片,物理 AI 普及终端的高性价比选择
大数据·人工智能·分布式·嵌入式硬件·spark
guslegend7 天前
第1章:初始Kafka
分布式·kafka