ActiveMQ Artemis QueueBrowser的hasMoreElements()始终返回false求助
JMS QueueBrowser hasMoreElements()始终返回false问题排查
我有两个JMS客户端,其中一个能正常查询队列消息,但另一个的enum.hasMoreElements()始终返回false。我怀疑问题出在消费者未激活的if/else代码块使用方式上——如果单独用QueueBrowser(不结合MessageConsumer)编写客户端,功能完全正常。当前队列确实存在消息,但hasMoreElements()还是返回false,而且我已经在创建枚举和浏览器之前调用了必需的cn.start()。
相关代码
// Consumer/Browser TextMessage msgIn = session.createTextMessage(); boolean consumerBool = false; if (consumerBool == true) { System.out.println("Consumer ready to consume ..."); msgIn = (TextMessage)consumer.receive(); System.out.println("Consumer received " + msgIn.getText()); } else { System.out.println("Starting QueueBrowser ... "); cn.start(); QueueBrowser browser = session.createBrowser(queue); Enumeration enumm = browser.getEnumeration(); boolean elementsBool = enumm.hasMoreElements(); Queue temp = browser.getQueue(); System.out.println("Browser using queue = " + temp); System.out.println("enumm.hasMoreElements() return = " + elementsBool); while(enumm.hasMoreElements()) { msgIn = (TextMessage)enumm.nextElement(); System.out.println("Browsed msg [" + msgIn.getText() + "]"); } browser.close(); } cn.close(); session.close();
可能的原因及调试方向
- 同会话下消费者实例干扰:代码中
consumer变量已存在(即使consumerBool为false),部分JMS实现不允许同一会话同时存在MessageConsumer和QueueBrowser,前者会抢占或屏蔽后者的消息获取。建议在进入else块前,先关闭consumer实例:if (consumer != null) { consumer.close(); } - 连接启动时机过晚:当前
cn.start()仅在else块内调用,若连接此前处于未启动或异常状态,可能影响Browser的消息同步。建议将cn.start()移到代码最开头,确保所有操作前连接已正常启动。 - 会话事务模式影响:如果会话是
SESSION_TRANSACTED模式,未提交的事务可能导致Browser无法看到队列中的消息。可尝试在创建Browser前提交事务(session.commit()),或改用AUTO_ACKNOWLEDGE模式创建会话。 - JMS提供者特性差异:不同JMS服务端(如ActiveMQ、Artemis)对Browser的实现有差异,部分需要短暂等待同步队列状态。可在创建枚举前添加100-500ms的休眠:
Thread.sleep(200); Enumeration enumm = browser.getEnumeration();
内容的提问来源于stack exchange,提问作者Mexicano_con_ingles
相关产品推荐
相关产品推荐

