Можно ли восстановить после исключения, а затем повторите попытку с помощью Spring Retry?

В Java было бы что-то вроде

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

Спасибо!!

0
jpadilladev 24 Апр 2017 в 13:23

2 ответа

Лучший ответ

В заключение,

Я создал RetryListener и добавил его в свой RetryTemplate. Когда выдается какое-то исключение, я восстанавливаюсь в методе onError из моего RetryListener, а затем 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;
}

Теперь вы можете внедрить bean-компонент retryTemplate в любое место и использовать метод execute () для восстановления после ошибок.

2
jpadilladev 27 Апр 2017 в 08:28

Более простая альтернатива - Failsafe:

RetryPolicy<Object> retryPolicy = new RetryPolicy<>().withMaxAttempts(2);

Failsafe.with(retryPolicy).get(() -> doSomething());
0
Jonathan 23 Янв 2019 в 19:58
43585597