动态控制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中的消费者 启动停止

相关推荐
数智启示录16 分钟前
Apache Kafka Consumer 扩到 40 个仍不提速:Partition 上限锁死有效并行度 【Kafka合集】
数据库·经验分享·分布式·缓存·面试·kafka·apache
数智启示录23 分钟前
Apache Kafka 幂等 Producer 的边界:Exactly-Once 到了 MySQL 为什么失效 【Kafka合集】
数据库·经验分享·分布式·mysql·面试·kafka·apache
数智启示录1 小时前
Apache Kafka 不只是消息队列:日志与 Offset 分离如何让事件可重放 【Kafka合集】
经验分享·分布式·面试·kafka·apache
数智启示录1 小时前
Apache Kafka 同 Key 仍会乱序:从分区 Offset 到业务可见的四道边界 【Kafka 合集】
大数据·数据库·经验分享·分布式·面试·kafka·apache
BYSJMG1 小时前
大数据毕业设计选题推荐:基于大数据的全球气温历史演变分析与可视化,用Hadoop+Spark处理
大数据·hadoop·分布式·信息可视化·spark·kmeans·课程设计
爱吃苹果的梨叔1 小时前
AI 算力监控中心怎么建?分布式坐席 + 大屏联动 + 过程回放
人工智能·分布式·python
無a伟1 小时前
RabbitMQ :与AMQP的关系、核心组件、交换机类型
分布式·rabbitmq
jyOverQ6 小时前
RabbitMQ 消息积压怎么办?Prefetch、消费者并发与扩容
分布式·后端·rabbitmq
爱浦路 IPLOOK16 小时前
矿山无人化作业5G专网方案:企业专网核心网络选型分析
网络·分布式·科技·5g·信息与通信
实战派K8S&DB17 小时前
如何在内网配置 TiDB 数据库 Agent
数据库·人工智能·分布式·tidb