9

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

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

谢谢!

4

1 回答 1

14

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

  • 消息有效,可以处理

正常处理适用。

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

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

  • 消息无效

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

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

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

于 2011-08-09T12:52:20.393 回答