我们的应用程序使用带有spring的MQ JMS类来消耗来自WebSphere MQ的消息。 MQ队列定义未设置回退阈值(BOTHRESH
)和回退队列名称(BOQNAME
)的任何值。在会话事务处理模式下,处理消息时发生异常时,不会发生消息传递重试。我看到异常说明没有定义中断队列。由于它没有定义,它试图向死信队列添加消息。那也失败了。我的问题是 -
答案 0 :(得分:0)
根据IBM知识中心page on backout behavior,
如果退出阈值为零,则进行有害消息处理 已禁用,并且有毒消息仍保留在输入队列中。除此以外, 当回退计数达到阈值时,消息是 发送到命名的回退队列。如果退出计数达到 阈值,但消息无法进入退出队列, 消息被发送到死信队列或被丢弃。
目的是,您可以使用JMSX_DELIVERY_COUNT
或JMS_IBM_MQMD_BackoutCount
来管理应用代码中的重新发送。
我怀疑知识中心至少有点错误,因为它说消息重新排队的消息将被丢弃。我认为这仅适用于非持久性消息,并提交了反馈意见,要求澄清。
但是,我对退出行为的理解是它在知识中心中被正确描述,并且您看到的行为不是IBM的JMS类所期望的行为。有两种可能性。首先,意外行为是在Spring代码而不是IBM的JMS代码中实现的。第二个是MQ JMS有一个错误,并且不按照文档行事。
通常我会应用“更有可能的东西?”测试和“MQ bug”没有上升到该列表的顶部。但是,我不知道Spring,专用的毒性消息处理代码的可能性,还是Spring代码的一般质量。因此,我建议使用独立的JMS代码执行相同的测试,或者打开PMR并与IBM Support一起跟踪代码并隔离退出失败的类。
答案 1 :(得分:0)
我使用MQ 7.5与BackOut BOTHRESH(1)和BOQNAME(SAMEQUEUE)。在我的情况下,我在BOQNAME中使用SOURCE QUEUE,因此我的主要QUEUE也是我的DLQ QUEUE,它允许消息轮换到我的消费者。 在Spring配置中,我只使用sessionTransacted =" true"。我做的另一件事是在我使用" q"之后的一段时间内在BOQNAME中使用DLQ。用于将消息从DLQ再次移动到主队列的实用程序。
希望有所帮助。