我们已经建立了基于ActiveMQ的应用程序基础架构。

我们可以发送和接收消息蛮好的,大部分东西都非常快,OK。

然而,我们注意到,如果我们提交一批消息“一次”,说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.

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

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

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

是否有某种方式说“对一个MessageListener的事件,请查看是否有其他消息队列现在和做所有这些?”

有帮助吗?

解决方案

原来,我们认为我们现在更多这是怎么回事知道一点。

在使用ActiveMQ的的DLL最终崩溃,我们的VB.NET WinForms应用程序,它趋向于一周做几次,我们有一个使用的Winternals则PsList和pskill公用事业牟取僵尸看门狗程序,然后再启动一个新的客户端连接。

当发生这种情况,使用jconsole分析经纪人告诉我们,僵尸的会话还是登记,所以是新鲜的新客户。

我的理论现在的问题是,当AMQ看见这两个会议,它会尝试启动邮件分发到两个会话循环样式。 AMQ尝试将消息发送到僵尸,不回应。后的一定时间(一秒也许)AMQ放弃并进入下一个会话列表中的,新的新鲜的客户端。

在某些时候,经纪人或TCP堆栈可能注意到了僵尸没有跟上它的TCP连接活跃,它就会放弃;然后操作返回到正常。

于是问题就来了,如何编写一个ActiveMQ的客户端a)不死或b)死亡优雅,在这个过程中关闭它的会话?

编辑:升级到的ActiveMQ的下一个版本解决了这个。此外,我们有一个单一的应用程序做的发送和接收,但它不是线程安全的 - 所以,如果收到,而它试图发送这引起了崩溃。我们重新写了它作为两个控制台应用程序,一个发送接收到的数据的数据和一个。没有更多的崩溃。此外ActiveMQ的旧版本,我们使用的时候没有处理事故摆好,升级到4.X解决了。

其他提示

我建议有可能沿此报告的用户论坛支持问题,因为这听起来像它可能是一些问题与NMS客户端代码和所有的NMS开发者都在此列,并可能作出回应

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top