题
我们已经建立了基于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解决了。