【发布时间】:2018-07-18 23:28:00
【问题描述】:
我使用 JBOSS 7 来托管我的 MDB 和 IBM MQ 作为我的消息传递提供程序。我正在使用 wmq.jmsra.rar 资源适配器与 IBM MQ 通信。
如果 Message1 被 MDB 消费,我们将消息内容存储到 DB 中。由于字段验证,它无法存储和抛出异常。我们处理了运行时异常并且 MDB 代码运行良好。现在,MDB 不再从队列中选择消息 2,而是继续再次选择消息 1 并一次又一次地处理......我们在日志文件中遇到错误。
2018-02-08 18:53:19,447 INFO [org.jboss.as.connector.deployers.RaXmlDeployer] (default-threads - 17) wmq.jmsra.rar: MQJCA4026:Transaction backed out with reason: 'The method 'xa_end' has failed with errorCode '100'.'.
2018-02-08 18:53:19,448 WARN [com.arjuna.ats.jta] (default-threads - 17) ARJUNA016045: attempted rollback of < formatId=131077, gtrid_length=29, bqual_length=36, tx_uid=0:ffff0a5b844a:bacea37:5a7c20fa:897, node_name=1, branch_uid=0:ffff0a5b844a:bacea37:5a7c20fa:898, subordinatenodename=null, eis_name=unknown eis name > (com.ibm.mq.connector.xa.XARWrapper@3d6ba018) failed with exception code XAException.XAER_NOTA: javax.transaction.xa.XAException: The method 'xa_rollback' has failed with errorCode '-4'.
【问题讨论】:
-
如果 XA 事务旨在将 MQ GET 和 DB INSERT 作为一个工作单元提交,如果 DB INSERT 失败,则消息将被退回到队列中。如果您查看队列上的消息,您会注意到 MQMD 中称为“退出计数”的字段。这应该在每次退出时增加。 MDB 还将查看两个队列级别设置,BOQNAME 和 BOTHRESH。如果这些都被填写,MDB 会将“坏”消息移动到以 BOQNAME 命名的队列中,如果在获取时退出计数等于 BOTHRESH。
-
如果以上方法可以解决您的问题,请告诉我,我会以答案形式写出来。
-
亲爱的 Josh,我们如何处理从 MDB java 的角度一次又一次地选择相同消息的无限循环。
-
嗨,普拉莫德,我在上面提出了一个解决方案,如果你想让我写下来,请确认这对你有用。它本质上会尝试按照您设置为 BOTHRESH 的次数处理消息,如果超过此次数,它会将消息移动到您在 BOQNAME 中指定的队列中。这些都是队列管理器端设置,因此 MQ 管理员需要设置它们。
-
谢谢 JoshMc,我会与 MQ 团队取得联系..