SpringBoot重试,剩余重试次数

SpringBoot retry, remaining retries

我在我的项目中使用了 spring 声明式重试,例如

@Service
class Service {
  @Async  @Retryable(maxAttempts=12, backoff=@Backoff(delay=100, maxDelay=500))
    public service() {
        // ... do something
    }
}

现在,我有两个问题。

  1. 使用异步重试可以吗,我没有任何问题,只是 想确定一下。

  2. 第二个要求是,如果进程失败,我想将其记录到日志文件中,包括剩余重试次数。那么,有没有办法通过,或者从方法内部获取剩余重试次数?

您应该使用 @Recover 注释对每次失败执行操作并在方法之外的对象内保持计数。确保没有其他方法与该计数器交互。这是基本前提:

@Service
class Service {


private int attemptsLeft=12;

@Retryable(maxAttempts=12, backoff=@Backoff(delay=100, maxDelay=500))
public service() {
    // ... do something that throws a KnownException you create to catch later on.
}

@Recover
public void connectionException(KnownException e) {
            this.attemptsLeft = this.attemptsLeft-1; //decrease your failure counter
            Logger.warn("Retry attempts left:{}",attemptsLeft);
        }
}

如果您不想要成员变量跟踪计数,您可能需要放弃注释并使用 getRetryCount() 方法声明 RetryTemplate 以访问上下文。

public String serviceWithRetry() {
    RetryTemplate retryTemplate = new RetryTemplate();
    final SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
    retryPolicy.setMaxAttempts(12);
    retryTemplate.setRetryPolicy(retryPolicy);
    FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy();
    backOffPolicy.setInterval(100L);
    retryTemplate.setBackOffPolicy(backOffPolicy);
    retryTemplate.execute(new RetryCallback<Void, RuntimeException>() 
        return retryTemplate.execute(new RetryCallback<Void, RuntimeException>() {
        @Override
        public void doWithRetry(RetryContext context) {
            LOG.info("Retry of connection count: {}", context.getRetryCount());
            return //something with your connection logic
        }
    });
}

没有办法绕过注释,@Recover 注释方法仅在最后一次失败重试后执行,而不是在每次失败后执行。

Refer to this github documentation

上述 link 的摘录 - "Call the "service" 方法,如果它因 RemoteAccessException 而失败,则它将重试(默认最多三次),然后执行 "recover" 方法,如果不成功。"

即使使用 RetryTemplate,只有在所有重试都用完后才会调用 Retry 回调。

另一个摘录形式相同 link- "When a retry is exhausted the RetryOperations can pass control to a different callback, the RecoveryCallback. To use this feature clients just pass in the callbacks together to the same method"