Spring重试找到上次重试
Spring retry find the last retry
我正在使用Spring-retry-1.2.0,重试工作正常,但在我的方法中我想知道重试是否是最后一次重试,是否有任何方法可以获取重试次数或最后一次在 spring 重试 - 重试?
Retrial.java
public class Offers extends SimpleRetryPolicy {
@Async
@Retryable(maxAttemptsExpression = "#{retrial.times}", backoff = @Backoff(delayExpression = "#{retrial.delay}"))
public void handleOfferes(Data data) {
AlwaysRetryPolicy policy = new AlwaysRetryPolicy();
RetryContext context = policy.open(null);
System.out.println("context.getRetryCount()::"+context.getRetryCount()); //Always logs 0 even if it retries 2 to 3 times...
System.out.println("Can retry::"+canRetry(context)); //Always true
//Business Logic
//Get the last count and update the DB ...retrial is ends with failure
}
@Override
public boolean canRetry(RetryContext context) {
System.out.println("context.getRetryCount()::"+context.getRetryCount());
System.out.println("getMaxAttempts::"+getMaxAttempts());
return context.getRetryCount() < getMaxAttempts();
}
}
Artem Bilan 发表评论后所做的更改
重试配置
@Configuration
public class RetryConfiguration {
@Value("${retrial.times}")
private Long delayExpression;
@Value("${retrial.delay}")
private int maxAttempts;
@Bean
@ConditionalOnMissingBean(name = "retryInterceptor")
public RetryOperationsInterceptor retryInterceptor() {
return RetryInterceptorBuilder
.stateless()
.backOffOptions(0L,
0.0D, delayExpression)
.maxAttempts(maxAttempts).build();
}
}
Offers.java
@Service
public class Offers {
@Async
@Retryable(interceptor = "retryInterceptor")
public void handleDeviceStatus(Data data) {
//Here how shall i get the retrial count...
}
任何帮助都将不胜感激。
我想你需要的是@Recover
(RecoveryCallback
如果没有注释):
@Retryable(RemoteAccessException.class)
public void service() {
// ... do something
}
@Recover
public void recover(RemoteAccessException e) {
// ... panic
}
如果你是手动creating/usingRetryTemplate的,你可以从RetryContext获取当前的重试次数,如下:
public String callWithRetry() {
return retryTemplate.execute(new RetryCallback<String, RuntimeException>() {
@Override
public String doWithRetry(RetryContext context) {
LOG.info("Retry count: {}", context.getRetryCount());
return theService.perform();
}
});
}
我正在使用Spring-retry-1.2.0,重试工作正常,但在我的方法中我想知道重试是否是最后一次重试,是否有任何方法可以获取重试次数或最后一次在 spring 重试 - 重试?
Retrial.java
public class Offers extends SimpleRetryPolicy {
@Async
@Retryable(maxAttemptsExpression = "#{retrial.times}", backoff = @Backoff(delayExpression = "#{retrial.delay}"))
public void handleOfferes(Data data) {
AlwaysRetryPolicy policy = new AlwaysRetryPolicy();
RetryContext context = policy.open(null);
System.out.println("context.getRetryCount()::"+context.getRetryCount()); //Always logs 0 even if it retries 2 to 3 times...
System.out.println("Can retry::"+canRetry(context)); //Always true
//Business Logic
//Get the last count and update the DB ...retrial is ends with failure
}
@Override
public boolean canRetry(RetryContext context) {
System.out.println("context.getRetryCount()::"+context.getRetryCount());
System.out.println("getMaxAttempts::"+getMaxAttempts());
return context.getRetryCount() < getMaxAttempts();
}
}
Artem Bilan 发表评论后所做的更改
重试配置
@Configuration
public class RetryConfiguration {
@Value("${retrial.times}")
private Long delayExpression;
@Value("${retrial.delay}")
private int maxAttempts;
@Bean
@ConditionalOnMissingBean(name = "retryInterceptor")
public RetryOperationsInterceptor retryInterceptor() {
return RetryInterceptorBuilder
.stateless()
.backOffOptions(0L,
0.0D, delayExpression)
.maxAttempts(maxAttempts).build();
}
}
Offers.java
@Service
public class Offers {
@Async
@Retryable(interceptor = "retryInterceptor")
public void handleDeviceStatus(Data data) {
//Here how shall i get the retrial count...
}
任何帮助都将不胜感激。
我想你需要的是@Recover
(RecoveryCallback
如果没有注释):
@Retryable(RemoteAccessException.class)
public void service() {
// ... do something
}
@Recover
public void recover(RemoteAccessException e) {
// ... panic
}
如果你是手动creating/usingRetryTemplate的,你可以从RetryContext获取当前的重试次数,如下:
public String callWithRetry() {
return retryTemplate.execute(new RetryCallback<String, RuntimeException>() {
@Override
public String doWithRetry(RetryContext context) {
LOG.info("Retry count: {}", context.getRetryCount());
return theService.perform();
}
});
}