ActiveMQ消息接收事件每秒只有一条消息?

时间:2008-12-23 20:45:02

标签: vb.net activemq

我们已经建立了基于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事件上,请查看队列中是否还有其他消息,并且全部完成”?

2 个答案:

答案 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开发人员都在该列表中可能会回应