ActiveMQ按需从队列中消耗所有消息

时间:2014-03-06 00:46:50

标签: java spring jms activemq

我有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;
        }
    }

2 个答案:

答案 0 :(得分:0)

始终打印例外。这将帮助您调试。

看看这个 - How to use Java JMS with MQseries

答案 1 :(得分:0)

当您使用receive()方法接收消息时,线程将阻塞,直到消息可用或超过超时值。这可以从JmsTemplate的Javadoc找到:

  

应谨慎使用此方法,因为它会阻塞线程   直到消息可用或直到超时值为止   超出。

阻止的默认超时值为RECEIVE_TIMEOUT_INDEFINITE_WAIT。因此,即使您没有访问该服务,您的上一个会话线程也会因为无限期等待而阻止。要更改默认超时值,可以将接收超时设置为

jmsTemplate.setReceiveTimeout(RECEIVE_TIMEOUT_NO_WAIT);

这样它就不会阻止,但如果当前没有消息,它将立即终止。