【问题标题】:ActiveMQ Message Receipt Event Only One Message Per Second?ActiveMQ 消息接收事件每秒只有一条消息?
【发布时间】:2009-11-07 06:55:34
【问题描述】:

我们已经建立了一个基于 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.

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

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

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

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

【问题讨论】:

    标签: vb.net activemq


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      我建议将此报告给User Forum,并可能提出support issue,因为这听起来可能是 NMS 客户端代码的问题,所有 NMS 开发人员都在该列表中并且可能会做出回应

      【讨论】:

        猜你喜欢
        • 2011-09-19
        • 1970-01-01
        • 2023-03-16
        • 2023-03-31
        • 2021-06-16
        • 2016-07-03
        • 1970-01-01
        • 2021-08-06
        • 2012-12-20
        相关资源
        最近更新 更多