我有REST服务,它使用来自队列的消息。我想按需消费消息 - 给我所有在休息服务被调用时队列中可用的消息。
我在Spring上使用ActiveMQ。下面是我在代码下面使用以从队列中获取消息的代码。第一次当我点击服务时,我得到队列中可用的所有消息,但如果我进一步发布更多消息,即使我没有点击服务,消息也会被订阅。这可能是什么原因?
while (true) {
try {
message = jmsTemplate.receive("TestQ");
if (message instanceof TextMessage) {
try {
System.out.println(((TextMessage) message).getText());
msg = ((TextMessage) message).getText();
} catch (JMSException ex) {
throw new RuntimeException(ex);
}
} else {
throw new IllegalArgumentException("Message must be of type TextMessage");
}
} catch (Exception ex) {
break;
}
}
答案 0 :(得分:0)
始终打印例外。这将帮助您调试。
答案 1 :(得分:0)
当您使用receive()
方法接收消息时,线程将阻塞,直到消息可用或超过超时值。这可以从JmsTemplate
的Javadoc找到:
应谨慎使用此方法,因为它会阻塞线程 直到消息可用或直到超时值为止 超出。
阻止的默认超时值为RECEIVE_TIMEOUT_INDEFINITE_WAIT
。因此,即使您没有访问该服务,您的上一个会话线程也会因为无限期等待而阻止。要更改默认超时值,可以将接收超时设置为
jmsTemplate.setReceiveTimeout(RECEIVE_TIMEOUT_NO_WAIT);
这样它就不会阻止,但如果当前没有消息,它将立即终止。