我正在研究一个基于消息的服务,该服务将所有传入请求排队并稍后处理它们。处理错误的最佳实践是什么?例如,向下一个系统发送信息时出现格式错误或通信错误。
通过使用事务可以处理后一种情况,但是当消息格式错误时,重试它或保留它是没有用的。是否有针对不同场景实现不同错误处理的想法,如果有,应该如何实现?
谢谢!
我认为你的思路是对的。这里有三种通用模式:
- 消息有效,可以处理
正常处理。
- 消息是有效的,但是现在不能处理
可能处理消息所需的某些资源不可用。在这种情况下,将事务设置为rollbackOnly,消息将被重新传递。希望您的JMS实现支持延迟重新交付的概念,这样在您的MIA资源再次可用之前,您就不会对同一消息进行数千次的重新处理。如果不是(是的,我就是在说您,WebSphere MQ),我通常做的是将消息推送到为暂时不可处理的消息保留的另一个JMS队列中并提交。当MIA资源重新联机时,我程序地从队列中读取所有消息,并将它们写回主[原始]队列,在主[原始]队列中处理它们直至完成。
- 消息无效
抑制异常并提交事务。你再也不会看到那条信息了。保持对无效消息的审计跟踪:
- 将无效消息写入bad队列,以便稍后对其进行检查。
- 注销消息内容
- 保留无效消息的JMX计数器(按类型,源队列,解析错误等划分)
但是,关键是要确保您提交了事务,如果您知道您将永远无法处理该消息。