【问题标题】:How do I limit the amount of times a JMS DefaultMessageListenerContainer will retry a message?如何限制 JMS DefaultMessageListenerContainer 重试消息的次数?
【发布时间】:2012-05-20 02:50:29
【问题描述】:

我正在使用 Spring JMS 连接到 Websphere MQ 服务器。我实现了 SessionAwareListener 接口来创建自定义侦听器,为业务逻辑重用旧代码。

在测试时,侦听器抛出一个 StringIndexOutOfBoundsException,我没能捕捉到。但是,我在日志中看到打印了大约 32 次,然后 DMLC 停止。

WARN  - Execution of JMS message listener failed

有没有办法控制 DMLC 重试消息的频率,以及如何处理未捕获的异常?

【问题讨论】:

  • 那么您使用 IBM MQ JCA 适配器对吗?您的 Spring 应用程序部署在哪里?
  • 不,我们只使用 Websphere MQ,而不是应用服务器。 Spring 应用程序是一个独立的 JVM。

标签: java jms ibm-mq


【解决方案1】:

您可以随时检查 JMSDeliveryCount。如果它超过您认为的最大值,则不要处理消息并返回。

您也可以configure your Websphere 在尝试后将错误消息移动到异常目的地。

【讨论】:

  • 感谢您的文章。这有助于了解后端发生了什么。我现在使用 JMSXDeliveryCount 和 JMSRedelivered JMS 属性来处理消息。
  • 您是否知道 Spring API 中也可以帮助处理错误的任何内容?
  • 不幸的是,我的朋友对 Spring 了解不多。
  • 哈哈,不用担心。我试图自己弄清楚。但是使用 Spring 已经删除了很多样板代码。我所要做的就是定义 MessageListener。值得向 IMO 学习。
  • 我一直使用纯 JEE,对此我很满意
【解决方案2】:

在发生错误后将消息放回队列在 Websphere MQ 世界中称为 backout

有两种处理方法:

  1. 在队列管理器中:您可以为给定队列配置回退阈值回退重新队列名称属性。达到回退阈值后,队列管理器会将消息放入回退重新队列名称指定的队列中,而不是重新传递。请参阅WebSphere MQ queue properties 了解更多信息。

  2. 在您的应用程序中:如果您使用 JMS API,请在开始处理消息之前通过调用 msessage.getIntProperty("JMSXDeliveryCount") 检查 JMSXDeliveryCount 属性。如果它达到某个阈值,则将该消息作为错误处理。

【讨论】:

  • 感谢您的回复!您与 DaTroop 一起帮助解决了这个问题。
  • 在 1 上,MQ 属性是重试限制的 BOTHRESH,达到重试限制后将转发消息的队列的 BOQNAME。
猜你喜欢
  • 1970-01-01
  • 2011-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
  • 2021-07-14
相关资源
最近更新 更多