【问题标题】:Spring Retry and RecoverySpring 重试和恢复
【发布时间】:2017-04-24 10:23:59
【问题描述】:

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

在 Java 中,类似于

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

谢谢!!

【问题讨论】:

  • 当然可以。这正是重试所做的。浏览本教程。 baeldung.com/spring-retry
  • @pvpkiran RetryTemplate 我在找什么? :)
  • 在这种情况下,我使用了带有 RetryTemplate 的“侦听器”。监听器调用上面的'recoverException',然后调用callback.doWithRetry。使用 RetryTemplate 的方法是否正确?
  • 我不确定您到底在寻找什么。在你的情况下使用'@Retryable'和'@Recover'应该是好的(从我所了解的很少)
  • @pvpkiran 据我所知,Recover 仅在 Retryable 完成所有重试后调用。我想“修复”我的方法抛出的异常,然后再次调用此方法。也就是说,我想处于重试的中间。我会在工作时用我的代码更新这个问题。

标签: java spring spring-retry


【解决方案1】:

最后,

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

【讨论】:

    【解决方案2】:

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

    RetryPolicy<Object> retryPolicy = RetryPolicy.ofDefaults();
    Failsafe.with(retryPolicy).get(() -> doSomething());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-14
      • 1970-01-01
      • 2015-03-28
      • 1970-01-01
      • 2012-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多