使用MQ JMS类和spring重新传递MQ消息

时间:2014-11-12 17:51:21

标签: java spring jms ibm-mq

我们的应用程序使用带有spring的MQ JMS类来消耗来自WebSphere MQ的消息。 MQ队列定义未设置回退阈值(BOTHRESH)和回退队列名称(BOQNAME)的任何值。在会话事务处理模式下,处理消息时发生异常时,不会发生消息传递重试。我看到异常说明没有定义中断队列。由于它没有定义,它试图向死信队列添加消息。那也失败了。我的问题是 -

  1. 当BOTHRESH = 0时,MQ JMS类是否可以重新传递消息?
  2. 通过以上设置,是否可以使用重新传递计数管理应用程序代码的邮件传递重试?

2 个答案:

答案 0 :(得分:0)

根据IBM知识中心page on backout behavior

  

如果退出阈值为零,则进行有害消息处理   已禁用,并且有毒消息仍保留在输入队列中。除此以外,   当回退计数达到阈值时,消息是   发送到命名的回退队列。如果退出计数达到   阈值,但消息无法进入退出队列,   消息被发送到死信队列或被丢弃。

目的是,您可以使用JMSX_DELIVERY_COUNTJMS_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再次移动到主队列的实用程序。

希望有所帮助。