前言

在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开启容器");
		}
	}
}
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐