鉴于我有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);
然后检索消息。
它与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(这是大多数如果涉及网络,则可能是这种情况(。