0

Spring Core Advice API 文档中定义了两种建议:

  • 每类建议 - 不得“依赖于代理对象的状态或添加新状态”
  • 每个实例的建议 - “将状态添加到代理对象”

根据 javadocs, RequestHandlerRetryAdvice具有无状态和有状态的操作模式。

在什么情况下 RequestHandlerRetryAdvice 可以用作每个类的建议?(即使用单个 bean 来通知多个处理程序)。

可以将“无状态模式”实例用作每个类的建议吗?

可以将“有状态模式”实例用作每个类的建议吗?

我找不到有关 RequestHandlerRetryAdvice 是否将状态添加到代理对象的信息,这是应用每个类/每个对象建议的标准条件的必要条件,如 Spring Core 参考中所述。

我的期望是在有状态模式下,建议不能作为每个类使用。

而对于无状态模式,尚不清楚它是否扩展了状态。(如果由多个处理程序共享 - 它要求在任何给定时刻最多有一个处理程序使用重试建议?)

请注意,另一篇文章中的答案暗示它总是可以的,因为它是“线程安全的”。但是,根据 Spring Core 参考文档(上面引用),这种条件不足以允许按类使用。

4

1 回答 1

0

在此环境中使用有状态重试时,状态(通常)是按消息维护的,而不是按处理程序维护的;可以在多个处理程序上使用相同的建议,只要您不期望会生成相同标识符的消息在不同的线程上同时命中多个处理程序(这将是非常不寻常的)。但即使是这种情况,也可以使用适当的状态生成器来适应。

Spring 集成文档...

为了使重试有状态,我们需要为 Advice 提供一个RetryStateGenerator实现。此类用于将消息标识为重新提交,以便 RetryTemplate 可以确定此消息的当前重试状态。该框架提供了一个SpelExpressionRetryStateGenerator使用 SpEL 表达式确定消息标识符的方法。

于 2017-10-16T13:21:12.197 回答