java - JMS QueueBrowser 卡在 getEnumeration() 上

标签 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);

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

但是,问题是代码卡在 while(messages.hasMoreElements() 行周围。从调试来看,它甚至从未进入循环内部。如果我在记录器中使用该行代码来检查值,挂起也会发生。

如果我只是使用 nextElement() 的枚举而不循环,那么我将返回一个空值。我无法确定这是否意味着队列或枚举为空。如果是这样,消息 hasMoreElements() 不应该返回正确的 boolean 值吗?

问题可能是我正在使用 JmsMessageListener 读取消息吗?我使用的模板错误吗?我无法真正确定哪里出了问题,因为看起来 90% 的内容都在工作,只有最后 10% 的内容似乎表现得很奇怪。

编辑:

设法让它工作。在我调用浏览器执行任何操作之前,我的 session 已关闭。我所需要做的就是将浏览器代码移动到 doInJms block 中,如下所示:

            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);

最佳答案

解决方案位于上面的编辑中,但是我想发布此内容以便于访问。我只需要将浏览器代码移至 doInJms block 内。另一种解决方案是使用 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);

关于java - JMS QueueBrowser 卡在 getEnumeration() 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26528241/

相关文章:

java - 如何使用 Struts 2 提供静态资源(图像、CSS 等)?

java - Mule 使用什么类来发送 JMS 消息(端点)

maven - activemq 拒绝远程连接

activemq - 是否有人将LevelDB存储用于ActiveMQ消息持久性?

java - 从 Android 模拟器连接到 LocalHost/10.0.2.2 超时

java - 如果键匹配,则为 HashMap 列表添加值

java - 如何将 javax.mail.BodyPart 内容转换为 UTF-8 干净文本?

java - activemq 代理启动后是否可以创建虚拟目的地和复合队列?

java - 从 Tomcat 使用 WebLogic (t3) JMS

tomcat - Atomikos、Tomcat、JTA java.lang.ClassCastException