我正在使用JAX-RPC 1.1为在WAS 6.0上运行的一组应用程序生成服务,并通过Websphere MQ进行通信。大型机将向服务发送消息,因此如果由于某种原因消息无法转换为对象(可能是由于EBCDIC到ASCII的怪异),则需要将消息放在死信队列中进行检查
有没有人知道是否有标准的方法(即通过提供带有DLQ名称的jms:/地址),或者是否需要以某种方式手动执行DLQ转发?
答案 0 :(得分:3)
首先,我建议您不要依赖DLQ。 DLQ是QMgr级资源,用于存储通道无法解析的消息。因为它是一个潜在的攻击媒介,所以大多数注重安全性的商店都不会授予对应用程序的访问权限,或者如果他们这样做,那么它就是put-only access。
执行此操作的最佳方法是创建特定于应用程序的异常队列。如果应用程序有多个输入队列,则它们都可以使用相同的异常队列,然后应用程序支持团队可以管理那里没有安全问题的任何消息。
无论您采用哪种方式,让应用程序兑现此功能都非常简单。例如,假设您的应用正在从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处理程序或观察该队列的任何其他工具。