鉴于我有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);
然后检索邮件。
答案 0 :(得分:2)
它与TEMPLATES = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [...],
"OPTIONS": {
"context_processors": [...],
"builtins": [...],
"loaders": [
"mezzanine.template.loaders.host_themes.Loader",
"django.template.loaders.filesystem.Loader",
"django.template.loaders.app_directories.Loader",
]
},
},
]
完全无关,因为它只是委托给基础的JMS JmsTemplate
对象:
Consumer
我会说它完全按照JMS设计师的意图工作:
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();
}
}
换句话说,这是在用例中,如果当前没有消息已经由经纪人发送给使用者,则您绝对绝对不想在任何时候阻塞线程-甚至没有等待网络I / O完成,这正是ActiveMQ实施的方式-启动I / O,但如果该I / O没有立即完成则返回null(如果涉及到网络,则很可能是这种情况)