JmsTemplate с RECEIVE_TIMEOUT_NO_WAIT не получает сообщения из очереди JMS
Учитывая, что у меня есть очередь ActiveMQ, где много сообщений уже присутствуют.
Когда я установил тайм-аут приема на JmsTemplate
в RECEIVE_TIMEOUT_NO_WAIT
который равен -1
:
jmsTemplate.setReceiveTimeout(JmsTemplate.RECEIVE_TIMEOUT_NO_WAIT);
и попробуйте получить одно из этих сообщений:
Message msg = jmsTemplate.receive(queueName);
затем msg
является null
, но это не должно быть в соответствии с JavaDoc:
/**
* Timeout value indicating that a receive operation should
* check if a message is immediately available without blocking.
*/
public static final long RECEIVE_TIMEOUT_NO_WAIT = -1;
Это почему?
Когда я делаю:
jmsTemplate.setReceiveTimeout(1000);
затем сообщения извлекаются.
1 ответ
Это абсолютно не имеет ничего общего с JmsTemplate
так как он просто делегирует базовый JMS Consumer
объект:
protected Message receiveFromConsumer(MessageConsumer consumer, long timeout) throws JMSException {
if (timeout > 0) {
return consumer.receive(timeout);
}
else if (timeout < 0) {
return consumer.receiveNoWait();
}
else {
return consumer.receive();
}
}
Я бы сказал, что он работает именно так, как задумывалось дизайнерами JMS:
/** Receives the next message if one is immediately available.
*
* @return the next message produced for this message consumer, or
* null if one is not available
*
* @exception JMSException if the JMS provider fails to receive the next
* message due to some internal error.
*/
Message receiveNoWait() throws JMSException;
Другими словами, это для случаев использования, когда вы абсолютно не хотите вообще блокировать поток, если в данный момент нет сообщения, которое уже было отправлено потребителю брокером - даже не ожидая завершение сетевого ввода-вывода, что именно так и реализовал ActiveMQ - инициирует ввод-вывод, но возвращает null, если этот ввод-вывод не завершается немедленно (что, скорее всего, имеет место при наличии сети).