我正在使用 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/