【问题标题】:How to specify which @Recover method to use for which @Retryable method?如何指定哪个@Recover 方法用于哪个@Retryable 方法?
【发布时间】:2021-11-04 22:45:01
【问题描述】:

所以,我有一个 Spring Boot 应用程序,在我的服务类中,我正在重试多种方法,在它们上使用 @Retryable。我还使用@Recover 注释为它们创建了各自的恢复方法。

现在,很多这些服务方法在方法签名中具有相同的属性;因此,它们的恢复方法最终也具有相同的签名。

这导致的问题是重试耗尽时的恢复方法选择与预期不符。我看到在方法 1 下声明的恢复方法在所有重试后方法 3 失败时被调用。

有没有办法控制恢复方法的选择?我已经看到了 RetryTemplate 的使用,其中明确提供了 RetryCallback 和 RecoveryCallback,这是唯一的方法吗?

谢谢!

代码如下:

@Retryable
public boolean method1(String arg1) {
// do something
}

@Recover
public boolean method1Recovery(Exception e, String arg1) {
//do something
}

.
.
.

@Retryable
public boolean method3(String arg1) {
// do something
}

@Recover
public boolean method3Recovery(Exception e, String arg1) {
//do something
}

【问题讨论】:

  • 另一种可能可行的方法是定义和使用不同的异常类型,例如Method1ExceptionMethod3Exception.
  • 这听起来很公平,但它会创建多个异常类来解决这个问题。我希望我不必那样做。但是感谢您的建议,这似乎是最简单的解决方法。
  • @slauth 如果您愿意发表您的评论作为答案,我会接受。请这样做。谢谢!
  • 同事建议的另一种方法是从方法中抛出不同的异常(即基本异常的子类),并使用相同的恢复来检查instanceOf 并确定如何处理每个异常。但同样,这取决于@slauth 建议的每个方法都有单独的例外。

标签: java spring spring-boot spring-retry recover


【解决方案1】:

另一种可能可行的方法是定义和使用不同的异常类型,例如Method1Exception ... Method3Exception.

【讨论】:

    猜你喜欢
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    • 2015-09-01
    • 1970-01-01
    相关资源
    最近更新 更多