我有一个消息驱动的 bean,它在某些条件下抛出异常。当它引发异常时,消息不会被处理并放回队列中。根据我对 MQ 和 WAS(Websphere 应用程序服务器)的理解,消息应该在尝试 x 次后被标记为错误并从队列中删除。这没有发生,并且消息保留在标记为错误的队列中。
我错过了 MQ 和/或 WAS 中配置的哪一部分设置正确?
(MDB 抛出异常的问题不是重点)
谢谢。
在队列上有属性 BOQNAME 和 BOQTHRESH。这些必须设置为要重新排队消息的回退队列的名称以及重新排队消息之前的回退次数阈值。
此外,QMgr 必须能够将消息放入指定队列。问题可能包括队列名称拼写错误、回退队列已满或运行 MDB 的帐户未被授权将消息放入回退队列。
如果 MDB 检测到有害消息循环并且无处可将消息重新排队,它将停止处理。您仍将看到该线程,但您将丢失队列中的一个或多个打开的输入句柄。在这种情况下,必须重新启动应用程序才能恢复它。
避免使用系统的 DLQ 作为回退目标。DLQ 是 QMgr 放置来自另一个无法解析到目标队列的 QMgr 的消息的地方。这些将附加一个死信标头,而重新排队的 MDB 消息则不会。这可能会导致您观看 DLQ 的任何自动化出现问题。因此,建议每个不是DLQ 的应用程序都有一个异常队列。
BOQTHRESH 应大于 1 或 2,因为正常操作(例如关闭 QMgr 或通道)可能会导致退出。我通常将 BOQTHRESH 设置为 5 或 10,但也看到有人将其设置得更高。取决于您对重试的容忍度以及回退是否通常是由临时条件(例如填满日志范围)引起的。
查看这篇WebSphere 如何处理有害消息的文章。
它适用于 WAS 5,但原则没有改变。