0

我们已经建立了一个基于 ActiveMQ 的应用程序基础设施。

我们可以很好地发送和接收消息,并且在大多数情况下,事情非常快而且还可以。

但是,我们注意到,如果我们“一次”提交一批消息,比如 5,000 条消息 - ActiveMQ 将很快将消息发送到另一端的第 3 方应用程序,并且该应用程序也将很快处理,并且它也会将回复排队快速返回给经纪人,比如不到一分钟。

但是由于某种原因,我们最初生成消息的 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.

接收器正在等待可能 9 个月前从 ActiveMQ 下载的 C# 代码中的事件 MessageListener:

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

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

有没有办法说“在 MessageListener 事件中,请查看队列中是否还有其他消息并全部执行”?

4

2 回答 2

1

事实证明,我们认为我们现在知道的更多了。

当我们使用 ActiveMQ DLL 的 VB.NET WinForms 应用程序最终崩溃时(通常每周会发生几次),我们有一个看门狗程序,它使用 Winternals pslist 和 pskill 实用程序来获取僵尸程序,然后启动一个新客户端联系。

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

我现在的理论是,当 AMQ 看到两个会话时,它会尝试开始以循环方式将消息分发到两个会话。AMQ 尝试将消息发送给僵尸,僵尸没有响应。一段时间后(也许一秒钟)AMQ 放弃并进入列表中的下一个会话,即新的新客户端。

在某些时候,代理或 TCP 堆栈可能会注意到僵尸没有保持其 TCP 连接处于活动状态并且它放弃了;然后操作恢复正常。

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

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

于 2009-01-09T20:44:09.810 回答
0

我建议向用户论坛报告此问题,并可能提出支持问题,因为这听起来可能是 NMS 客户端代码的问题,所有 NMS 开发人员都在该列表中并且可能会做出回应

于 2008-12-31T07:44:55.163 回答