Java 在使用JAX-RPC时,如何在死信队列中放置错误请求?

Java 在使用JAX-RPC时,如何在死信队列中放置错误请求?,java,ibm-mq,jax-rpc,Java,Ibm Mq,Jax Rpc,我正在使用JAX-RPC1.1为运行在WAS6.0上的一组应用程序生成服务,并通过WebSphereMQ进行通信。大型机将向服务发送消息,因此如果由于某种原因无法将消息转换为对象(可能是由于EBCDIC到ASCII的怪异),则需要将消息置于死信队列中进行检查 是否有人知道是否有一种标准方法可以做到这一点(即通过提供带有DLQ名称的jms:/address),或者是否需要手动执行DLQ转发?首先,我建议您不要依赖DLQ来实现这一点。DLQ是QMgr级别的资源,用于存储通道无法解析的消息。因为它是一

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


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

首先,我建议您不要依赖DLQ来实现这一点。DLQ是QMgr级别的资源,用于存储通道无法解析的消息。因为它是一个潜在的攻击向量,大多数安全意识的商店将不允许访问应用程序,或者如果它们这样做,只会访问。 最好的方法是创建一个特定于应用程序的异常队列。如果应用程序有多个输入队列,则它们都可以使用相同的异常队列,然后应用程序支持团队可以管理任何到达那里的消息,而不会出现安全问题

无论你走哪条路,让应用程序尊重这一点都是非常容易的。例如,假设您的应用程序正在读取JAX.SVC.REQUEST。定义异常队列并将BOQ*字段指向该队列:

defql(JAX.SVC.EXCEPTION) alterql(JAX.SVC.REQUEST)BOQNAME(JAX.SVC.EXCEPTION)BOQTHRESH(5)

JMS类将在队列打开时查询队列的BOQ*属性,并检查每次读取的消息的退出计数。在程序中,使用事务处理会话,如果无法处理消息,请调用session.backout()方法。消息将被读取和退出不超过两次,然后重新加入到BOQNAME中命名的队列中。如果该队列已满或不可用,将尝试DLQ。如果失败,类将抛出异常

我们选择一个BOTHRESH>1,以允许在关闭QMgr时退出可处理消息的可能性

我通常会触发异常队列,以便在有东西到达时发出警报或发送电子邮件。如果您有一个监视工具,您可以检查深度>0


如果出于某种原因,您不想使用JMS功能来自动重新查询消息,那么应用程序将需要逻辑来重新查询消息。如果要将消息放在DLQ上,则需要在DLQ标头前加上前缀。如果不这样做,可能会破坏DLQ处理程序或任何其他监视该队列的工具。

谢谢T。Rob,这是非常好的信息,我没有意识到JMS类可以使用回退队列信息。