【问题标题】:Different retry attempts for different exceptions in Spring @RetryableSpring中不同异常的不同重试尝试@Retryable
【发布时间】:2017-10-24 13:19:47
【问题描述】:

在我的 SpringBoot 应用程序中,我有一个可以发送 POST 请求的客户端。并且在 POST 期间它可能有几个例外。

我希望有一个重试逻辑以防 2 个不同的异常。但在某种程度上,max-retry-attempts 应该对每个异常生效,而不是一起生效。很难解释,但举个例子:

max-retry-attempts 配置为 3。如果我得到 exception1 类型,而不是重试,我还有 2 次重试。再试一次并再次获取异常1,然后重试,现在我还剩 1 次重试。再试一次,现在我得到了异常 2,然后再试一次,现在我还有 2 次重试,因为之前的重试是针对异常 1 而不是针对异常 2。所以exception2重试才刚刚开始。

有可能吗?我试过这个,但这不会从重试尝试开始,如果发生了异常1,然后发生了异常2,那么我还有1次重试:

@Retryable(maxAttempts = 3, value = {Exception1.class, Exception2.class}, backoff = @Backoff(delay = 3000, multiplier = 2))

【问题讨论】:

    标签: spring spring-retry


    【解决方案1】:

    您必须创建自定义重试策略;并将其配置为RetryTemplateRetryOperationsInterceptor;使用注解上的interceptor 属性来引用拦截器。

    【讨论】:

    • 你有这方面的例子吗?因为我找不到合适的例子,有不同的例外来按照我描述的那样行事。
    • 否;正如我所说,您需要创建一个自定义策略来添加该逻辑。
    【解决方案2】:

    我认为@Retryable 注释不存在。如果您选择使用 RetryTemplate 实现,您可以使用以下内容对不同的异常进行不同的重试尝试,并将其设置到 RetryTemplate 对象中:

    final SimpleRetryPolicy simpleRetryPolicyTenTimes = new SimpleRetryPolicy();
    simpleRetryPolicyTenTimes.setMaxAttempts(10);
    final SimpleRetryPolicy simpleRetryPolicyTwoTimes = new SimpleRetryPolicy();
    simpleRetryPolicyTwoTimes.setMaxAttempts(2);
    final Map<Class<? extends Throwable>, RetryPolicy> policyMap = new HashMap<>();
    policyMap.put(RetryException.class, simpleRetryPolicyTenTimes);
    policyMap.put(HardFailException.class, simpleRetryPolicyTwoTimes);
    final ExceptionClassifierRetryPolicy retryPolicy = new ExceptionClassifierRetryPolicy();
    retryPolicy.setPolicyMap(policyMap);
    return retryPolicy;
    

    您可以在此处找到示例: https://www.programcreek.com/java-api-examples/index.php?api=org.springframework.retry.policy.ExceptionClassifierRetryPolicy

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-30
      • 2020-10-26
      • 1970-01-01
      • 1970-01-01
      • 2019-08-25
      相关资源
      最近更新 更多