【问题标题】:MQ Queue MQTT_DEPT trying to generate multiple trigger messagesMQ 队列 MQTT_DEPT 尝试生成多个触发消息
【发布时间】:2015-11-26 06:53:29
【问题描述】:

我们有一个 HA 应用程序,它在几个指向同一个队列管理器的服务器上运行。因为消息排序很重要,我们使用信号量队列来确保没有两个应用程序正在从业务队列中读取消息,即使该队列上有多个消息等待处理。

工作流程如下:

  1. 业务队列上设置了 MQTT_DEPT 触发器,当队列 dept 等于 1 时触发
  2. 业务队列接收一个或多个消息。
  3. 当队列部门变为 1 并将触发消息放入启动队列时触发触发器。
  4. 作为队列部门触发器,它应该在将触发器消息传递到启动队列后自行关闭
  5. 有一个 MDB 正在侦听获取触发消息的启动队列
  6. 因为顺序对我们来说至关重要,我们对启动队列进行了限制,以使最大队列深度为 1。这样,一次只有一个 MDB 可以收到消息
  7. 当触发消息到达时,MDB 会从业务队列中读取所有消息,并在完成后将触发激活消息发送到专用队列。
  8. 一旦完成,它就会提交所有内容。触发器生成的消息被丢弃。此时触发器激活消息可供处理。
  9. 激活 MDB 的触发器获取激活消息,然后在业务队列上重新打开队列部门触发器,以便整个流程重新开始。

在大多数情况下,一切正常。但是,有时我们会在死信队列中收到一些消息,这会导致我们的监控工具调用支持。检查 DLQ 中的消息,我们注意到它们是触发器生成的消息,发送到 DLQ 的原因是初始化队列已满(请记住我们的最多一条消息的限制)。

我们没有解释这怎么可能。 IBM 文档说,在发送第一个触发器生成的消息后触发被关闭,但是从我们的实验来看,看起来第一个触发器生成的消息被处理并且处于未提交状态,第二个触发器生成的消息被创建并发送到启动队列。无法传递它(因为 max dept = 1 限制)它将它发送到死信队列。

任何关于为什么这可能以及如何解决它的意见都将非常受欢迎。凌晨 2:00 的虚假支持电话肯定不好笑。

提前感谢您的意见。

【问题讨论】:

    标签: jms ibm-mq


    【解决方案1】:

    我们的问题的解释是在 IBM MQ 触发文档中,我们应该更仔细地阅读 IBM note:

    注意:如果您停止并重新启动队列管理器,TriggerInterval 计时器将被重置。有一个小窗口,在此期间可以产生两条触发消息。当队列的触发器属性设置为在消息到达的同时启用并且队列以前不是空的 (MQTT_FIRST) 或有 TriggerDepth 或更多消息 (MQTT_DEPTH) 时,该窗口存在。

    一旦我们得到解释,解决方案就很简单了。我们没有将业务队列配置为将触发生成的消息直接发送到启动队列,而是将其配置为发送到设置了最大队列部门限制的不同队列。然后我们实现了另一个 MDB 来获取这些触发器生成的消息并将它们重定向到启动队列。由于现有队列部门的限制,此 MDB 已实现两次吞没由于无法将触发器生成的消息传递到启动队列而导致的任何异常。

    换句话说,在这个新的 MDB 中,我们承担了从我们手中的 MQ 管理器传递触发器生成消息的角色,并使该过程忽略了由队列部门引起的任何传递失败。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-19
      • 1970-01-01
      相关资源
      最近更新 更多