我正在使用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的逻辑是如何工作的,它是如何获取锁的,以及为了使代码工作,我需要进行哪些额外的配置。
答案 0 :(得分:0)
它正在等待消费者即时,那些忙于处理已经获取但尚未确认的消息的消费者。在关机期间,没有人会从队列中轮询新的消息。
要发布的所有内部ActiveObjectCounter
等待CountDownLatch
。这种情况发生在我们:
public void handleShutdownSignal(String consumerTag, ShutdownSignalException sig) {
因此,在private volatile int concurrentConsumers = 1;
期间,您的所有消费者(默认情况下为shutdownTimeout
)都会被取消并释放。
但是,当状态为shutdown
时,没有机构会从Broker轮询新消息。