我正在使用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);
答案 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);