在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开启容器");
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)