1

是否可以从异常中恢复,然后使用 Spring Retry 重试?

在Java中,会像

try{
    doSomething(); // throws Exception
}catch(Exception e){
    recoverException();
    doSomething(); // OK
}

谢谢!!

4

2 回答 2

2

最后,

我创建了一个 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() 方法从错误中恢复。

于 2017-04-27T08:28:32.163 回答
1

一个更简单的替代方案,使用Failsafe

RetryPolicy<Object> retryPolicy = RetryPolicy.ofDefaults();
Failsafe.with(retryPolicy).get(() -> doSomething());
于 2019-01-23T19:58:02.347 回答