带有 RECEIVE_TIMEOUT_NO_WAIT 的 JmsTemplate 不会从 JMS 队列中检索消息



鉴于我有ActiveMQ队列,其中已经存在许多消息。

当我将JmsTemplate上的接收超时设置为RECEIVE_TIMEOUT_NO_WAIT等于-1时:

jmsTemplate.setReceiveTimeout(JmsTemplate.RECEIVE_TIMEOUT_NO_WAIT); 

并尝试接收以下消息之一:

Message msg = jmsTemplate.receive(queueName);

那么msgnull,但它不应该根据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);

然后检索消息。

它与JmsTemplate完全无关,因为它只是委托给底层 JMSConsumer对象:

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;

换句话说,它适用于您绝对不想在任何时间阻塞线程的用例,如果当前没有代理已经发送给消费者的消息 - 甚至不等待网络I/O完成,这正是ActiveMQ实现它的方式 - 启动I/O,但如果I/O没有立即完成,则返回null(这是大多数如果涉及网络,则可能是这种情况(。

相关内容

  • 没有找到相关文章

最新更新