JMS QueueBrowser挂在getEnumeration()上

时间:2014-10-23 12:36:20

标签: java jms activemq message-queue spring-jms

我正在使用ActiveMQ摆弄JMS队列,我想制作一个队列浏览器。我在网上查了一些例子,但是我在使用它时遇到了很多麻烦。

以下是相关代码:

   QueueBrowser browser = template.execute(new SessionCallback<QueueBrowser>() {
   public QueueBrowser doInJms(Session session) throws JMSException {
           return session.createBrowser(queue);
                    }
                }, true);

               Enumeration messages = browser.getEnumeration();
               int num = 0;
                while(messages.hasMoreElements()) {
                    messages.nextElement();
                    num +=1;
                }
                logger.info("Num = " + num);

我已经注入模板和队列,并使用一些日志语句,我已经验证它们是我想要的对象。一旦实例化,我甚至可以从QueueBrowser中检索队列。我已经用大约100条消息填充了队列,并使用自定义JmsMessageListener读取它们,这两个消息在读取之间有大约1秒的延迟。

然而,问题是代码挂在while(messages.hasMoreElements()行周围。从调试开始,它甚至都不会进入循环。如果我在记录器中有这行代码来检查值,那么挂起也会发生。

如果我只是在没有循环的情况下使用枚举nextElement(),那么我就返回了一个空值。我无法确定这是否意味着队列或枚举为空。如果是这样,那么消息hasMoreElements()是否应该返回一个正确的布尔值?

问题可能是我正在使用JmsMessageListener读取消息吗?我使用模板错了吗?我无法确定出现问题的地方,因为它看起来有90%是有效的,只是最后10%看起来很奇怪。

编辑:

管理以使其正常运行。在我打电话给浏览器做任何事情之前,我的会话正在关闭。我需要做的就是将浏览器代码移动到doInJms块中:

            template.execute(new SessionCallback<QueueBrowser>() {
                public QueueBrowser doInJms(Session session) throws JMSException {
                    QueueBrowser browser =  session.createBrowser(queue);
                    Enumeration messages = browser.getEnumeration();
                    int num = 0;
                    logger.info("" + messages.hasMoreElements());
                    while(messages.hasMoreElements()) {
                        messages.nextElement();
                        num +=1;
                    }
                    logger.info("Num = " + num);
                    return null;
                }
            }, true);

1 个答案:

答案 0 :(得分:1)

解决方案在上面的编辑中,但是我想发布这个以便于访问。我只需要在doInJms块中移动浏览器代码。另一个解决方案是使用template.browse并创建一个新的BrowserCallback来覆盖。最后解决方案类似。

        template.execute(new SessionCallback<QueueBrowser>() {
            public QueueBrowser doInJms(Session session) throws JMSException {
                QueueBrowser browser =  session.createBrowser(queue);
                Enumeration messages = browser.getEnumeration();
                int num = 0;
                logger.info("" + messages.hasMoreElements());
                while(messages.hasMoreElements()) {
                    messages.nextElement();
                    num +=1;
                }
                logger.info("Num = " + num);
                return null;
            }
        }, true);