【问题标题】:MQ Queue MQTT_FIRST Trigger creating multiple trigger messagesMQ 队列 MQTT_FIRST 触发器创建多个触发器消息
【发布时间】:2014-03-06 05:15:49
【问题描述】:

我们有一个标记为已触发的应用程序 MQ 队列并在其上设置了 MQTT_FIRST。

当消息第一次到达该队列时,队列管理器会创建一条触发消息并将其写入我们为此目的定义的启动队列中。 触发消息触发监控进程的执行,该进程将启动一个触发监控应用程序,该应用程序将从应用程序队列中一一读取消息。

我们使用 Spring JmsTemplate 从应用队列中一一读取消息。该 jmsTemplate 实例打开与应用程序队列的连接,从那里读取消息,然后关闭连接。

我们遇到的问题是,当连接关闭时,如果应用程序队列中有多个消息,则会将新的触发消息发送到启动队列,这将导致另一个触发监视器应用程序(在不同的主机上运行)弹出窗口。这不是我们想要的,因为对于我们来说,必须同时只有一个消息消费者处于活动状态,因为消息序列非常重要。

我们有多个触发器监视器应用程序(或消费者)的原因是出于 HA 的原因。

所以我的问题是:有没有办法阻止 MQ 管理器向启动队列发送多个 MQTT_FIRST 触发消息,并使其仅在消息到达空队列时发送一次,仅此而已。如果我们真的想要再次发送消息触发器,我们可以为此使用触发器间隔,但是对于我们试图实现的目标,无论如何,启动队列中的触发器消息都不应超过一个。

提前致谢 朱利安

【问题讨论】:

    标签: java spring jms ibm-mq mq


    【解决方案1】:

    我们遇到的问题是,当连接关闭时,如果有 应用程序队列中的多条消息,一条新的触发消息将 被发送到启动队列,这将导致另一个 触发监控应用程序(在不同的主机上运行)弹出。

    .

    有没有办法防止 MQ 管理器发送多个 MQTT_FIRST 触发消息到启动队列并使其只发送一次 当一条消息到达一个空队列时,就是这样。

    是的,不要关闭连接。使用 Trigger First 时需要阅读规则。规则之一是在关闭连接之前使用所有消息。如果你不遵守规则,那么你就不能抱怨。

    【讨论】:

    • 我没有抱怨。我正在寻找现有规则背景下的解决方案。当您大量收到数千条消息时,由于各种原因一次性处理它们是不切实际的:超时、交易太大等
    • 您可能需要重新考虑设计。在这种情况下,首先触发看起来不像是正确的解决方案。如果交易大小是一个问题,您可以尝试按深度触发。
    • 最简单的解决方案是大大减少你的批处理窗口。即不是每 6 小时运行一次,而是每小时或每 20 分钟运行一次。
    • @nsupathy 你是对的。 MQTT_FIRST 没有为我们完成这项工作。遗憾的是,IBM 人员没有为我们提供一个标志来告诉队列管理器我只希望在收到第一条消息时触发该触发器,而不是其他时间。只要我不断地收听启动队列,IBM 就不应该关心我如何从我的应用程序队列中读取消息。换句话说,“你告诉我我收到了一条消息,让我可以随心所欲地处理它们,并且只有在我离开启动队列而不是应用程序队列时才再次告诉我我收到了消息”。除了实际规则之外,很高兴拥有。
    • @Roger 你假设我们等待一批建立然后开始消费它。这是错误的,因为我们希望尽快处理消息。我指出我们正在寻求 HA 解决方案。为什么我们需要这个触发器,因为我们希望我们的“竞争”MDB 一次只运行一次,因此我们让它们监听启动队列而不是应用程序队列,因此一旦消息到达,它将只有一个 MDB 来处理它.如果一个 MDB 出现故障,将会有其他一些人在保持消息顺序的同时接管负载。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    相关资源
    最近更新 更多