【问题标题】:ActiveMQ Consume all messages from queue on demandActiveMQ 按需消费队列中的所有消息
【发布时间】:2014-04-08 09:19:04
【问题描述】:

我有 REST 服务,它使用队列中的消息。我想按需消费消息 - 当调用 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;
        }
    }

【问题讨论】:

    标签: java spring jms activemq


    【解决方案1】:

    始终打印异常。这将帮助您调试。

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

    【讨论】:

      【解决方案2】:

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

      这个方法要小心使用,因为它会阻塞线程 直到消息可用或超时值变为 超过了。

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

      jmsTemplate.setReceiveTimeout(RECEIVE_TIMEOUT_NO_WAIT);
      

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

      【讨论】:

        猜你喜欢
        • 2015-09-23
        • 1970-01-01
        • 2014-08-08
        • 1970-01-01
        • 2015-03-17
        • 2020-12-01
        • 1970-01-01
        • 2013-12-13
        • 1970-01-01
        相关资源
        最近更新 更多