SpringBoot重试,剩余重试次数
SpringBoot retry, remaining retries
我在我的项目中使用了 spring 声明式重试,例如
@Service
class Service {
@Async @Retryable(maxAttempts=12, backoff=@Backoff(delay=100, maxDelay=500))
public service() {
// ... do something
}
}
现在,我有两个问题。
使用异步重试可以吗,我没有任何问题,只是
想确定一下。
第二个要求是,如果进程失败,我想将其记录到日志文件中,包括剩余重试次数。那么,有没有办法通过,或者从方法内部获取剩余重试次数?
您应该使用 @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"
我在我的项目中使用了 spring 声明式重试,例如
@Service
class Service {
@Async @Retryable(maxAttempts=12, backoff=@Backoff(delay=100, maxDelay=500))
public service() {
// ... do something
}
}
现在,我有两个问题。
使用异步重试可以吗,我没有任何问题,只是 想确定一下。
第二个要求是,如果进程失败,我想将其记录到日志文件中,包括剩余重试次数。那么,有没有办法通过,或者从方法内部获取剩余重试次数?
您应该使用 @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"