当前位置: 首页 > 知识库问答 >
问题:

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

欧渝
2023-03-14

我们有内部服务总线安装。我可以使用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)上下文。查找(“MS\U SERVICE\U BUS”);连接=连接工厂。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客户端还是服务总线中?

谢谢,简

共有1个答案

邬令
2023-03-14

这里发生了两件事:

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

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

 类似资料:
  • 我想在我的服务总线队列中接收挂起的消息。我浏览了一些关于接收消息的链接(https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-java-how-to-use-queues),但其中不包含有关如何接收和查看这些消息的信息。 从服务总线队列接收消息的Java代码如下[我是Java新手]:- 但当我运行此代码时,

  • 我正在使用azure服务总线主题和订阅机制,并希望处理所有在死信队列中的消息。 此外,我想通过C#中的Azure Web作业处理消息,并将其发送回队列。所以我想知道如何通过我的应用程序处理死信队列上的消息?

  • 我有一个服务总线Q,从Azure门户可以或多或少地看到服务总线Q包含多少条目。如何使用他们的管理API获取此计数?我仔细阅读了文档,但没有找到答案。

  • 我正在尝试创建QueueClient并将其超时时间从默认值60秒增加到60秒。当我从Connectionstring创建客户端时,它工作正常,但我无法调整时间。当我使用下面的工厂代码创建客户机时,我得到以下超时异常。谁能告诉我我错过了什么或只是没有做什么。 {“请求在00:00:00毫秒后超时。无法确定请求是否成功完成。应进行其他查询以确定操作是否成功。”} 工作于Endpoint=sb://xx

  • 今天晚上,我们观察到排队时间非常慢。我们的追踪数据告诉我们 需要45-60秒。这种情况发生在两个已经存在很长时间的队列上。他们几乎从来没有超过1-2条记录,我们使用一个带有服务总线触发器的网络作业来完成任务。我们正在排队等候一个简单的POCO。还有另一个队列正在快速排队,所以由于没有任何其他想法,我删除了两个麻烦的队列。当代码重新创建它们时(正如它被构建时所做的那样),它们在不到一秒钟的时间里开始

  • 我在MassTransit和azure服务总线上开发了一个简单的发布/订阅示例作为消息代理。我不明白的是,每次启动解决方案时,MassTransit都会为每个连接到总线的服务实例创建一个队列: 我不知道这样做的目的是什么。在我停止服务后,队列将被释放。MassTransit文档没有对此给出解释。也许这里有人知道?