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

时间:2018-06-20 17:25:52

标签: spring jms spring-jms jmstemplate

鉴于我有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);

然后检索邮件。

1 个答案:

答案 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(如果涉及到网络,则很可能是这种情况)