【问题标题】:Spring Integration message redelivery best practiceSpring Integration 消息重投最佳实践
【发布时间】:2014-09-16 23:07:42
【问题描述】:

我目前正在使用 Spring Integration 开发一个应用程序。该应用程序需要有保证的交付,并且可以选择在外部系统不可用的特定时间内运行而不丢失消息。通道将由具有过期时间的 JMS 支持。我想了解哪个是使用 Spring Integration 重新交付的最佳实践。我们有以下选择:

  1. 应用程序的集成流具有许多需要与外部系统进行 RPC 调用的出站消息网关。可以使用有状态的重试建议。在达到特定运行时异常的最大尝试次数后,消息将被发送到恢复通道。恢复通道将使用延迟器,然后将消息发送回原始通道。在消息到达恢复通道 X 次之后,它将被发送到错误通道,在那里它会被简单地记录下来,而无需进一步处理。在这种情况下,延迟器组件应该使用 jdbc 消息存储选项。

  2. 另一个选项是使用标准 JMS 选项进行重新传递。在这种情况下,重新交付策略不会在 Spring Integration 上实现,而是在 JMS 提供者端实现。

使用 Spring Integration 重新传递消息的最佳实践是什么?

【问题讨论】:

    标签: spring jms spring-integration


    【解决方案1】:

    我会这样说:不要重新发明轮子!

    如果已经有一些类似的解决方案,只需使用它的特定配置即可。

    好吧,如果 JMS 有这个解决方案,那就继续吧。 当然,在消息过期或重新传递耗尽的情况下,需要处理 DLQ。但概念就在这里。

    【讨论】:

    • 谢谢阿特姆。在这种情况下,我是否也应该使用重试或断路器建议(例如临时网络问题等)?如果抛出异常,它将由 JMS 重新传递,还是由 SI 处理并发送到 errorChannel?
    • 如果您与errorChannel 达成协议,该消息将不会被重新发送。您确实应该回滚事务以将消息返回到 JMS 队列。重试或断路器:取决于您的要求。我会说重试类似于重新交付。 CircuitBreaker 用于提前回滚。
    • 如何避免错误通道,因为 SI 默认将消息寻址到错误通道?我应该实现一个自定义通道通知来捕获异常并回滚 jms 事务吗?
    • 尝试使用<int-jms:message-driven-channel-adapter>的默认配置
    猜你喜欢
    • 1970-01-01
    • 2011-03-07
    • 2012-03-13
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多