我正在使用 JAX-RPC 1.1 为在 WAS 6.0 上运行的一组应用程序生成服务,并通过 Websphere MQ 进行通信。大型机将向服务发送消息,因此如果由于某种原因无法将消息转换为对象(可能是由于 EBCDIC 到 ASCII 的怪异),则需要将消息放在死信队列中进行检查.
有谁知道是否有标准的方法来做到这一点(即通过为 jms:/ 地址提供 DLQ 名称),或者是否需要以某种方式手动执行 DLQ 转发?
首先,我建议您不要为此依赖 DLQ。DLQ 是 QMgr 级别的资源,用于存储通道无法解析的消息。因为它是一种潜在的攻击媒介,所以大多数具有安全意识的商店不会授予对应用程序的访问权限,或者如果他们这样做了,则只是 put-only 访问权限。
最好的方法是创建一个特定于应用程序的异常队列。如果应用程序有多个输入队列,它们都可以使用相同的异常队列,然后应用程序支持团队可以管理任何到达那里的消息,而不会出现安全问题。
无论您采用哪种方式,让应用程序兑现这一点都非常容易。例如,假设您的应用正在读取 JAX.SVC.REQUEST。您定义异常队列并将 BOQ* 字段指向它:
DEF QL(JAX.SVC.EXCEPTION) ALTER QL(JAX.SVC.REQUEST) BOQNAME(JAX.SVC.EXCEPTION) BOQTHRESH(5)
JMS 类将在队列打开时查询队列的 BOQ* 属性,并检查读取的每条消息的回退计数。在您的程序中使用事务处理会话,如果您无法处理消息,请调用 session.backout() 方法。消息将被读取和退出不超过 BOTHRESH 次,然后重新排队到以 BOQNAME 命名的队列中。如果该队列已满或不可用,则将尝试 DLQ。如果失败,类将抛出异常。
我们选择 BOTHRESH > 1 以允许在例如关闭 QMgr 时退出可处理消息的可能性。
我通常触发异常队列,以便它可以在有什么东西落在它上面时发出警报或发送电子邮件。如果您有监控工具,则可以改为检查深度 > 0。
如果出于某种原因不想使用 JMS 功能自动重新排队消息,应用程序将需要逻辑来重新排队。如果您要将消息放在 DLQ 上,您将需要预先添加一个 DLQ 标头。不这样做可能会破坏 DLQ 处理程序或任何其他监视该队列的仪器。