Spring 重试和恢复
Spring Retry and Recovery
是否可以从异常中恢复,然后使用 Spring 重试重试?
在 Java 中,类似于
try{
doSomething(); // throws Exception
}catch(Exception e){
recoverException();
doSomething(); // OK
}
谢谢!!
最后,
我创建了一个 RetryListener 并将其添加到我的 RetryTemplate 中。当抛出一些异常时,我在我的 RetryListener 的 onError 方法中恢复,然后 RetryTemplate 将自动重试。
类似
@Component
public class CustomRetryListener extends RetryListenerSupport {
@Override
public <T, E extends Throwable> void onError(RetryContext context,
RetryCallback<T, E> callback,
Throwable throwable) {
//recover from throwable
}
}
和重试模板 bean
@Bean
public RetryTemplate retryTemplate(CustomRetryListener listener) {
RetryTemplate retryTemplate = new RetryTemplate();
SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
retryPolicy.setMaxAttempts(2);
retryTemplate.setRetryPolicy(retryPolicy);
retryTemplate.registerListener(listener);
return retryTemplate;
}
现在您可以在任何需要的地方注入 retryTemplate bean 并使用 execute() 方法从错误中恢复。
更简单的替代方法,使用 Failsafe:
RetryPolicy<Object> retryPolicy = RetryPolicy.ofDefaults();
Failsafe.with(retryPolicy).get(() -> doSomething());
是否可以从异常中恢复,然后使用 Spring 重试重试?
在 Java 中,类似于
try{
doSomething(); // throws Exception
}catch(Exception e){
recoverException();
doSomething(); // OK
}
谢谢!!
最后,
我创建了一个 RetryListener 并将其添加到我的 RetryTemplate 中。当抛出一些异常时,我在我的 RetryListener 的 onError 方法中恢复,然后 RetryTemplate 将自动重试。
类似
@Component
public class CustomRetryListener extends RetryListenerSupport {
@Override
public <T, E extends Throwable> void onError(RetryContext context,
RetryCallback<T, E> callback,
Throwable throwable) {
//recover from throwable
}
}
和重试模板 bean
@Bean
public RetryTemplate retryTemplate(CustomRetryListener listener) {
RetryTemplate retryTemplate = new RetryTemplate();
SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
retryPolicy.setMaxAttempts(2);
retryTemplate.setRetryPolicy(retryPolicy);
retryTemplate.registerListener(listener);
return retryTemplate;
}
现在您可以在任何需要的地方注入 retryTemplate bean 并使用 execute() 方法从错误中恢复。
更简单的替代方法,使用 Failsafe:
RetryPolicy<Object> retryPolicy = RetryPolicy.ofDefaults();
Failsafe.with(retryPolicy).get(() -> doSomething());