使用 Spring JMS 进行错误处理的最佳实践

Posted

技术标签:

【中文标题】使用 Spring JMS 进行错误处理的最佳实践【英文标题】:Best practice for error handling with Spring JMS 【发布时间】:2011-10-23 01:12:45 【问题描述】:

我正在开发一个基于消息的服务,该服务将所有传入请求排队并稍后处理它们。处理错误的最佳实践是什么。例如,将信息发送到下一个系统时出现格式错误的消息或通信错误。

通过使用事务可以处理后者,但是当消息格式错误时,重试或保留它是没有用的。有没有办法针对不同的场景实现不同的错误处理,如果有,应该怎么做?

谢谢!

【问题讨论】:

【参考方案1】:

我认为你在正确的轨道上。这里有三种一般模式:

消息有效,可以处理

正常处理适用。

消息有效,但目前无法处理

也许您处理消息所需的某些资源不可用。在这种情况下,将事务设置为 rollbackOnly,消息将被重新传递。希望您的 JMS 实现支持延迟重新传递的概念,这样在您的 MIA 资源再次可用之前,您不会重复处理相同的消息数千次。如果不是(是的,我在看你,WebSphere MQ),我通常会将消息推送到另一个 JMS 队列中,该队列保留用于暂时无法处理的消息并提交。当 MIA 资源重新上线时,我按程序从该队列中读取所有消息,并将它们写回主 [原始] 队列,在那里它们被处理完成。

消息无效

抑制异常并提交事务。您将永远不会再看到该消息。保留无效消息的审计跟踪:

将无效消息写入错误队列,以便稍后对其进行检查。 注销消息内容 保留无效消息的 JMX 计数器(按类型、源队列、解析错误等划分)

不过,主要的一点是,如果您知道您将永远无法处理该消息,请确保您提交了事务。

【讨论】:

感谢您提供非常有用的答案!这听起来是个不错的方法。您有使用 Spring 实现此功能的经验吗?现在,我大量依赖 DefaultMessageListenerContainer,这使得在每个事件中执行建议的操作变得稍微困难​​一些。但我不想走低级。有什么想法吗?

以上是关于使用 Spring JMS 进行错误处理的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

JMS 生产者最佳实践 [关闭]

Spring整合Weblogic jms实战

Spring Batch在大型企业中的最佳实践

Spring Batch在大型企业中的最佳实践

Spring Batch 在大型企业中的最佳实践

Django - 异常处理最佳实践和发送自定义错误消息 [关闭]