使用 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 进行错误处理的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章