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, если этот ввод-вывод не завершается немедленно (что, скорее всего, имеет место при наличии сети).

Другие вопросы по тегам