如何使用@RabbitListener优雅地停止使用消息

时间:2019-05-05 12:15:40

标签: java spring rabbitmq spring-amqp spring-rabbitmq

是否可以正常停止ListenerContainer及其相关的Consumers

我要实现的目标。

  1. 停止消耗消息。
  2. 优雅地停止ListenerContainer
  3. 等待长期运行的使用者,并在完成后确认。

我可以使用ListenerContainers停止consumer.stop(),但是长期运行的使用者不会成功完成,并且处理后的消息也不会得到确认,因此一旦ListenerContainer已恢复。

输出

Waiting for workers to finish.
Workers not finished.
Closing channel for unresponsive consumer: Consumer@6d229b1c

邮件已处理,但未确认。

我也许可以使用setForceCloseChannel(false)实现正常关机,但是是否可以验证被取消的使用者是否已完成? SimpleMessageListenerContainer.doShutDown()具有本地范围的列表“ canceledConsumers”。

1 个答案:

答案 0 :(得分:1)

增加关闭超时时间。

请参见Message Listener Container Configuration

  

shutdownTimeout

     

当容器关闭时(例如,如果关闭了其封闭的ApplicationContext),它将等待处理运行中的消息直至达到此限制。默认为五秒钟。

/**
 * The time to wait for workers in milliseconds after the container is stopped. If any
 * workers are active when the shutdown signal comes they will be allowed to finish
 * processing as long as they can finish within this timeout. Defaults
 * to 5 seconds.
 * @param shutdownTimeout the shutdown timeout to set
 */
public void setShutdownTimeout(long shutdownTimeout) {