SimpleMessageListenerContainer shutdowntimeoutout
Я использую spring-rabbit-1.7.3.RELEASE.jar
Я определил SimpleMessageListenerContainer в моем XML с параметром shutdownTimeout.
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 позволит обработать сообщения. Но этого не происходит.
При дальнейшем исследовании я обнаружил, что метод await(), определенный в SimpleMessageListenerContainer, всегда возвращает true.
this.cancellationLock.await(Long.valueOf(this.shutdownTimeout), TimeUnit.MILLISECONDS);
Я хотел бы понять, как работает логика для await, как он получает блокировку и какая дополнительная конфигурация требуется для моей работы, чтобы код работал.
1 ответ
Он ждет потребителей на лету, тех, кто занят обработкой уже полученных, но еще не подтвержденных сообщений. Никто не собирается опрашивать свежие сообщения из очереди во время выключения.
ActiveObjectCounter
ждет на все внутреннее CountDownLatch
s будет выпущен. И это происходит, когда мы:
public void handleShutdownSignal(String consumerTag, ShutdownSignalException sig) {
Таким образом, это действительно может быть фактом, что все ваши потребители (private volatile int concurrentConsumers = 1;
по умолчанию) отменяются и освобождаются в течение этого shutdownTimeout
,
Но опять же: никто не собирается опрашивать новые сообщения от Брокера, когда государство shutdown
,