SimpleMessageListenerContainer shutdowntimeout

时间:2018-01-18 19:08:10

标签: spring-integration spring-rabbit spring-rabbitmq shutdown-hook spring-integration-amqp

我正在使用spring-rabbit-1.7.3.RELEASE.jar

我在xml中使用shutdownTimeout参数定义了一个SimpleMessageListenerContainer。

bean id="aContainer"
class="org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer">
    <property name="connectionFactory" ref="rabbitConnectionFactory" />
    <property name="queueNames" value="aQueue" />
    <property name="adviceChain" ref="retryAdvice" />
    <property name="acknowledgeMode" value="AUTO" />
    <property name="shutdownTimeout" value="900000" />
</bean>

当我的服务关闭并且&#34; aQueue&#34;中仍然有消息时,我希望shutdownTimeout允许消息被处理。但这似乎不会发生。

在进一步调查中,我发现SimpleMessageListenerContainer中定义的await()方法总是返回true。

this.cancellationLock.await(Long.valueOf(this.shutdownTimeout), TimeUnit.MILLISECONDS); 

我想了解await的逻辑是如何工作的,它是如何获取锁的,以及为了使代码工作,我需要进行哪些额外的配置。

1 个答案:

答案 0 :(得分:0)

它正在等待消费者即时,那些忙于处理已经获取但尚未确认的消息的消费者。在关机期间,没有人会从队列中轮询新的消息。

要发布的所有内部ActiveObjectCounter等待CountDownLatch。这种情况发生在我们:

public void handleShutdownSignal(String consumerTag, ShutdownSignalException sig) {

因此,在private volatile int concurrentConsumers = 1;期间,您的所有消费者(默认情况下为shutdownTimeout)都会被取消并释放。

但是,当状态为shutdown时,没有机构会从Broker轮询新消息。