springboot项目RabbitMq手动开启/关闭监听
前言
在springboot项目中使用rabbitmq的@RabbitListener自动开启监听。而如果直接上了生产环境,在升级时候贸然kill掉,可能会损坏业务链条。实为不妥。
1、自动启动监听
@RabbitListener(queues = "#{queue}",concurrency = "#{concurrency}") public void receiveMsg(SmsMsg message) { }
2、手动关闭所有监听
当我们想kill掉程序的时候,可以使用kill -15 pid发送信号给java程序,这样就会通过Runtime.getRuntime()执行钩子线程,通过注册的钩子线程调用RabbitListenerEndpointRegistry提供的stop方法。本例在Application的main方法中,注册钩子线程。完成方法如下:
public static void main(String[] args) { ConfigurableApplicationContext applicationContext = SpringApplication.run(Application.class, args); //停止前,先断开rabbit,保证业务执行完毕后停止 Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { try { RabbitListenerEndpointRegistry rabbitListenerEndpointRegistry = applicationContext.getBean( RabbitListenerConfigUtils.RABBIT_LISTENER_ENDPOINT_REGISTRY_BEAN_NAME,RabbitListenerEndpointRegistry.class); rabbitListenerEndpointRegistry.stop(); log.info("kill -15 主动结束"); Thread.sleep(20000); log.info("结束完毕"); } catch (Throwable e) { e.printStackTrace(); } } }); }
3、手动启动监听
需要配置autoStartup:
@RabbitListener(queues = "${queue}",autoStartup= "false",id = "123")
可以根据id启动,也可以启动所有:
Collection<MessageListenerContainer> containers = rabbitListenerEndpointRegistry.getListenerContainers(); if(containers != null && containers.size() > 0) { for(MessageListenerContainer container:containers) { if(!container.isRunning()){ container.start(); log.info("rabbit开启容器"); } } }