浏览服务总线队列在hasMoreElements()中挂起

时间:2014-02-06 14:56:37

标签: java amqp servicebus azureservicebus qpid

我们有内部服务总线安装。我可以使用QPID AMQP 1.0 0.24客户端发布和订阅/阅读消息。但是,队列浏览操作工作时,当队列中没有更多消息时,对hasMoreElements()的调用将无限期挂起。堆栈跟踪是:

Thread [main] (Suspended)   
waiting for: ConnectionEndpoint  (id=19)    
Object.wait(long) line: not available [native method]   
ConnectionEndpoint(Object).wait() line: 503 
Receiver.drainWait() line: 533  
QueueBrowserImpl$MessageEnumeration.hasMoreElements() line: 154 
Qpid.testBrowseTopic(Connection, Context) line: 209 
Qpid.runTest(Qpid$Options) line: 93 
Qpid.main(String[]) line: 63    

代码:

ConnectionFactory connectionFactory =(ConnectionFactory)context.lookup(“MS_SERVICE_BUS”);     connection = connectionFactory.createConnection();

session = connection.createSession(false/*transacted*/, Session.AUTO_ACKNOWLEDGE);

Queue queue = (Queue) context.lookup("MY_QUEUE");

browser = session.createBrowser(queue);

Enumeration<Message> msgs = browser.getEnumeration();

while (msgs.hasMoreElements()) {// hangs when there are no more messages
    Message message = msgs.nextElement();
    //printMessage(message);
}

QPID 0.22的行为相同。这是QPID客户端或服务总线中的错误吗?

谢谢,Jan

1 个答案:

答案 0 :(得分:3)

这里有几件事:

1)Service Bus目前不支持通过AMQP进行消息浏览。因为会话是使用AUTO_ACKNOWLEDGE创建的,所以从枚举中获得的每条消息都会立即从队列中删除。

2)我用QPid 0.25复制了hasMoreElements()中的挂起。似乎hasMoreElements()正在等待更多消息到达队列,至少在开始时是这样。如果我发送更多消息,循环将继续,并且将返回一些新到达的消息,但它会相当快地停止。我仍在调查,以确定那里发生了什么。