首页 文章

使用JAX-RPC时在死信队列中放置错误请求的方法?

提问于
浏览
1

我正在使用JAX-RPC 1.1为在WAS 6.0上运行的一组应用程序生成服务,并通过Websphere MQ进行通信 . 大型机将向服务发送消息,因此如果由于某种原因消息无法转换为对象(可能是由于EBCDIC到ASCII的怪异),则需要将消息放在死信队列中进行检查 .

有没有人知道是否有标准的方法来做到这一点(即通过提供带有DLQ名称的jms:/地址),或者是否需要以某种方式手动执行DLQ转发?

1 回答

  • 3

    首先,我建议您不要依赖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处理程序或观察该队列的任何其他工具 .

相关问题