2008-12-23 181 views
0

我们构建了基于ActiveMQ的应用程序基础架构。ActiveMQ消息收据事件每秒只有一条消息?

我们可以很好地发送和接收消息,并且大部分情况下都非常快速和可靠。

但是,我们已经注意到,如果我们一次提交一批消息,比如说5,000条消息,那么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. 

接收器正在等待从C#代码的事件消息监听从ActiveMQ的,也许10个月前下载:

Public Delegate Sub MessageListener(ByVal message As NMS.IMessage) 
    Member of: NMS 

我认为发生的事情是,消息监听只给我们一个消息(NMS.IMessage)咀嚼,所以这就是我们所处理的。

有没有什么方法可以说:“在MessageListener事件上,请查看队列上是否有其他消息,并执行它们”?

回答

1

一起转动我们认为我们现在知道更多这是关于什么。

当我们的VB.NET WinForms应用程序使用ActiveMQ DLL最终崩溃时,它每周会做几次,我们有一个看门狗程序,它使用Winternals pslist和pskill实用程序来收割僵尸,然后开始一个新的客户端连接。

发生这种情况时,使用jconsole来分析代理向我们显示僵尸会话仍然被注册,新客户端也是如此。

我现在的理论是,当AMQ看到两个会话时,它都会尝试开始将消息分配给两种会话循环模式。 AMQ尝试将消息发送给僵尸,僵尸不响应。经过一段时间(可能是一秒),AMQ放弃并进入列表中的下一个会话,即新的新客户端。

在某些情况下,代理或TCP协议栈可能会注意到僵尸并未保持其TCP连接处于活动状态并放弃;然后操作恢复正常。

所以问题是,如何编写一个ActiveMQ客户端,a)不死或b)优雅地死掉,关闭它的过程中的会话?

编辑:升级到下一个版本的ActiveMQ解决了这个问题。此外,我们有一个应用程序执行发送和接收,但它不是线程安全的 - 因此,如果它在尝试发送时收到,则会导致崩溃。我们将它重新编写为两个控制台应用程序,一个发送数据和一个接收数据。没有更多的崩溃。此外,我们当时使用的旧版ActiveMQ没有妥善处理崩溃,升级到4.x解决了这个问题。

0

我建议这个报告对User Forum有可能提高一个support issue,因为这听起来像它可能是一些问题与NMS客户端代码和所有的NMS开发者都在此列,并可能做出反应