我使用的是spring-rabbit 1.7.3.RELEASE.jar
我已经用shutdownTimeout参数在我的xml中定义了一个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>当我的服务关闭时,"aQueue“中仍然有消息,我希望shutdownTimeout会允许处理这些消息。但这似乎并没有发生。
经过进一步的研究,我发现在SimpleMessageListenerContainer中定义的await()方法总是返回true。
this.cancellationLock.await(Long.valueOf(this.shutdownTimeout), TimeUnit.MILLISECONDS); 我想了解等待的逻辑是如何工作的,它是如何获取锁的,以及在我的端需要哪些额外的配置才能使代码工作。
发布于 2018-01-19 03:19:29
它等待运行中的消费者,即那些忙于处理已经获取但尚未确认的消息的消费者。在关机期间,没有人会从队列中轮询新的消息。
ActiveObjectCounter等待释放所有内部CountDownLatch。这种情况发生在我们:
public void handleShutdownSignal(String consumerTag, ShutdownSignalException sig) {所以,这可能真的是一个事实,所有的消费者(默认情况下是private volatile int concurrentConsumers = 1;)在shutdownTimeout期间被取消和释放。
但是再说一次:当状态为shutdown时,没有任何主体将轮询来自代理的新消息。
https://stackoverflow.com/questions/48328643
复制相似问题