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

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

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

谢谢!

【问题讨论】:

    标签: spring-jms queueing


    【解决方案1】:

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

    • 消息有效,可以处理

    正常处理适用。

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

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

    • 消息无效

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

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

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

    【讨论】:

    • 感谢您提供非常有用的答案!这听起来是个不错的方法。您有使用 Spring 实现此功能的经验吗?现在,我大量依赖 DefaultMessageListenerContainer,这使得在每个事件中执行建议的操作变得稍微困难​​一些。但我不想走低级。有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 2015-12-02
    • 2018-09-12
    • 2017-11-26
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多