SpringBoot+RabbitMQ_自定义监听容器的启动和停止

一、前言

    当启动程序时,并且MQ队列中有消息,这些消息的消费就会在应用程序完全启动之前开始,但是启动程序要初始化一些程序要用的数据,在没有初始化完成时消费这些消息会报错,所以希望在程序初始化完成后,再启动RabbitMQ的监听容器。

二、解决方案

    @RabbitListener注解的属性中有两个属性,一个是id,给监听容器一个id标识;一个是autoStartup,当autoStartup为false的时候,监听容器就不会自动启动,然后我们可以通过使用单个容器的ID,调用RabbitListenerEndpointRegistry类的getListenerContainer(String id)方法来获得对单个容器的引用,并执行strat方法,启动容器。

具体代码:

1、修改容器为不自动启动

    @RabbitListener(id = "xue",queues = "xue.xiao.bai",autoStartup = "false")
    @RabbitHandler
    public void process(String command){
        System.out.println("从xue.xiao.bai队列得到消息为:"+command+"\n");
    }

2、程序初始化数据完毕后,再启动容器

@Component
public class MyApplicationRunner implements ApplicationRunner {

    private final RabbitListenerEndpointRegistry registry;

    @Autowired
    public MyApplicationRunner(RabbitListenerEndpointRegistry registry) {
       this.registry =  registry;
    }

    @Override
    public void run(ApplicationArguments args) {
        //执行一些数据初始化代码(省略)
        //得到容器的对象
        MessageListenerContainer container = registry.getListenerContainer("xue");
        //判断容器状态
        if(!container.isRunning()){
            //开启容器
            container.start();
            System.out.println("开启容器");
        }
    }
}

三、扩展

    RabbitListenerEndpointRegistry类,容器是用一个map来管理的

private final Map<String, MessageListenerContainer> listenerContainers = new ConcurrentHashMap();
根据容器id得到对应的容器对象
public MessageListenerContainer getListenerContainer(String id)
得到容器id的set集合
public Set<String> getListenerContainerIds()
得到监听容器的集合
public Collection<MessageListenerContainer> getListenerContainers()

 

    AbstractMessageListenerContainer类实现了MessageListenerContainer类

    AbstractMessageListenerContainer类中的start()方法:启动对消息队列的监听。

public void start()

    AbstractMessageListenerContainer类中的start()方法:启动对消息队列的监听。

public void stop()

~~OVER~~

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值