【发布时间】:2015-11-26 06:53:29
【问题描述】:
我们有一个 HA 应用程序,它在几个指向同一个队列管理器的服务器上运行。因为消息排序很重要,我们使用信号量队列来确保没有两个应用程序正在从业务队列中读取消息,即使该队列上有多个消息等待处理。
工作流程如下:
- 业务队列上设置了 MQTT_DEPT 触发器,当队列 dept 等于 1 时触发
- 业务队列接收一个或多个消息。
- 当队列部门变为 1 并将触发消息放入启动队列时触发触发器。
- 作为队列部门触发器,它应该在将触发器消息传递到启动队列后自行关闭
- 有一个 MDB 正在侦听获取触发消息的启动队列
- 因为顺序对我们来说至关重要,我们对启动队列进行了限制,以使最大队列深度为 1。这样,一次只有一个 MDB 可以收到消息
- 当触发消息到达时,MDB 会从业务队列中读取所有消息,并在完成后将触发激活消息发送到专用队列。
- 一旦完成,它就会提交所有内容。触发器生成的消息被丢弃。此时触发器激活消息可供处理。
- 激活 MDB 的触发器获取激活消息,然后在业务队列上重新打开队列部门触发器,以便整个流程重新开始。
在大多数情况下,一切正常。但是,有时我们会在死信队列中收到一些消息,这会导致我们的监控工具调用支持。检查 DLQ 中的消息,我们注意到它们是触发器生成的消息,发送到 DLQ 的原因是初始化队列已满(请记住我们的最多一条消息的限制)。
我们没有解释这怎么可能。 IBM 文档说,在发送第一个触发器生成的消息后触发被关闭,但是从我们的实验来看,看起来第一个触发器生成的消息被处理并且处于未提交状态,第二个触发器生成的消息被创建并发送到启动队列。无法传递它(因为 max dept = 1 限制)它将它发送到死信队列。
任何关于为什么这可能以及如何解决它的意见都将非常受欢迎。凌晨 2:00 的虚假支持电话肯定不好笑。
提前感谢您的意见。
【问题讨论】: