我们已经建立了基于ActiveMQ的应用程序基础架构。
我们可以很好地发送和接收消息,而且大部分内容都非常快且可以。
但是,我们注意到,如果我们“一次”提交一批消息,比如5000条消息 - 那么ActiveMQ会很快将消息发送到另一端的第三方应用程序,并且该应用程序将处理也很快,并且它会快速地将回复排队回经纪人,比如说不到一分钟。
但是出于某种原因,我们首先发起消息的VB.NET EXE似乎只是处理它不正常收到的返回消息,有时每秒大约做一次,有时会休息一小时左右然后回到每秒一次。
Origin (VB.NET EXE which we manage)
-> Broker (which we manage)
-> (3rd party app)
-> back to the same broker
-> back to the origin app.
Receiver正在等待9个月前从ActiveMQ下载的C#代码中的事件MessageListener:
Public Delegate Sub MessageListener(ByVal message As NMS.IMessage)
Member of: NMS
我认为正在发生的事情是MessageListener只给我们一条消息(NMS.IMessage)来咀嚼,这就是我们处理的内容。
有没有办法说“在MessageListener事件上,请查看队列中是否还有其他消息,并且全部完成”?
答案 0 :(得分:1)
原来,我们认为我们现在知道的更多了。
当我们使用ActiveMQ DLL的VB.NET WinForms应用程序最终崩溃时,它往往会每周做几次,我们有一个监视程序,它使用Winternals pslist和pskill实用程序来获取僵尸,然后启动一个新的客户连接。
当发生这种情况时,使用jconsole分析代理向我们显示僵尸的会话仍然已注册,新的新客户端也是如此。
我现在的理论是,当AMQ看到两个会话时,它会尝试开始向两个会话循环播放消息。 AMQ尝试将消息发送给僵尸,后者没有响应。经过一段时间(也许是一秒钟)后,AMQ放弃并进入列表中的下一个会话,即新的新客户端。
在某些时候,代理或TCP堆栈可能会注意到僵尸没有保持它的TCP连接处于活动状态并且它放弃了;然后操作恢复正常。
所以问题就变成了,如何写一个a)没有死亡或b)优雅地死掉的ActiveMQ客户端,在这个过程中关闭它的会话?
编辑:升级到下一版本的ActiveMQ解决了这个问题。我们还有一个应用程序在进行发送和接收,但它不是线程安全的 - 所以如果它在尝试发送时收到它会导致崩溃。我们将其重新编写为两个控制台应用程序,一个发送数据,另一个接收数据。没有更多的崩溃。我们当时使用的旧版ActiveMQ也没有优雅地处理崩溃,升级到4.x解决了这个问题。
答案 1 :(得分:0)
我建议将此报告给User Forum,同时可能会提出support issue,因为这听起来可能是NMS客户端代码的问题,所有NMS开发人员都在该列表中可能会回应