🤞 Персональная домашняя страница:@青城Sequencer Stone
🤞 Преимущества вентилятора:Добавить фан-базуОтвечайте на вопросы один на один, получайте бесплатные шаблоны резюме, улучшайте учебные материалы и т. д. и станьте королем новой эры!
Сразу после предыдущей статьи "Все еще повторяю попытку вручную, попробуйте Spring Retry (1)", щелкните Перейти.
В-четвертых, RetryTemplate
RetryTemplate
является альтернативой использованию формы аннотации для повторной попытки.
4.1 RetryOperations
использоватьRetryOperations
интерфейсSpring retry providesRetryOperations
Стратегия.
public interface RetryOperations {
<T> T execute(RetryCallback < T > retryCallback) throws Exception;
// other execute methods
<T> T execute(RetryCallback < T > retryCallback, RecoveryCallback < T > recoveryCallback,
RetryState retryState) throws Exception;
}
RetryCallback
Позволяет вставлять бизнес-логику, которую необходимо повторить в случае сбоя.
public interface RetryCallback <T> {
T doWithRetry(RetryContext context) throws Throwable;
}
4.2 RetryTemplate
RetryTemplate
при условииRetryOperations
конкретное воплощение. Создание bean-компонентов считается хорошей практикой.
@Bean
@ConditionalOnMissingBean
public RetryTemplate retryTemplate(){
final SimpleRetryPolicy simpleRetryPolicy = new SimpleRetryPolicy();
simpleRetryPolicy.setMaxAttempts(4);
final FixedBackOffPolicy fixedBackOffPolicy = new FixedBackOffPolicy();
fixedBackOffPolicy.setBackOffPeriod(1000L);
return RetryTemplate.builder()
.customPolicy(simpleRetryPolicy)
.customBackoff(fixedBackOffPolicy)
.retryOn(CustomRetryException.class)
.build();
}
Делайте модульные тесты.
@Autowired
pivate RetryTemplate retryTemplate;
@Test
void retryWithoutAnnotation(){
try {
String message = retryTemplate.execute(x -> retryService.retryWithoutAnnotation());
log.info("message = "+message);
} catch (CustomRetryException e) {
log.error("Error while executing test {}",e.getMessage());
}
}
Как показано на следующем рисунке, он также повторил попытку четыре раза, но неrecover
стратегия.
4.2 RecoveryCallback
execute
, вы можете ввестиRecoveryCallback
Обратный вызов, после подтверждения того, что повторная попытка завершена, все равно возникает исключениеrecovery
поведение. Сигнатура метода выглядит следующим образом.
public final <T, E extends Throwable> T execute(RetryCallback<T, E> retryCallback, RecoveryCallback<T> recoveryCallback) throws E {
return this.doExecute(retryCallback, recoveryCallback, (RetryState)null);
}
Итак, настраиваемRecoveryCallback
.
@Slf4j
public class CustomRecoveryCallback implements RecoveryCallback<String> {
@Override
public String recover(RetryContext retryContext) throws Exception {
log.info("Default Retry service test,total retry {}",retryContext.getRetryCount());
return "Error Class :: " + retryContext.getLastThrowable().getClass().getName();
}
}
Затем выполните модульные тесты.
@Autowired
private CustomRecoveryCallback customRecoveryCallback;
@Test
void retryWithoutAnnotation(){
try {
String message = retryTemplate.execute(x -> retryService.retryWithoutAnnotation(), customRecoveryCallback);
log.info("message = "+message);
} catch (CustomRetryException e) {
log.error("Error while executing test {}",e.getMessage());
}
}
Как показано на следующем рисунке, после завершения повторной попытки наш пользовательскийrecover
.
Пять, RetryListenerSupport
Что, если мы хотим настроить некоторые механизмы мониторинга и обработки событий в соответствии с различными этапами жизненного цикла повторных попыток? установить пользовательскийRetryListenerSupport
может помочь нам. мы наследуемRetryListenerSupport
, и повторноOverride
close
,onError
,open
метод, три метода представляют
- когда все попытки заканчиваются
- Каждый раз, когда возникает исключение
- Повторите попытку до официального старта.
@Slf4j
public class DefaultListenerSupport extends RetryListenerSupport {
@Override
public <T, E extends Throwable> void close(RetryContext context, RetryCallback<T, E> callback, Throwable throwable) {
log.info("DefaultListenerSupport close");
super.close(context, callback, throwable);
}
@Override
public <T, E extends Throwable> void onError(RetryContext context, RetryCallback<T, E> callback, Throwable throwable) {
log.info("DefaultListenerSupport onError");
super.onError(context, callback, throwable);
}
@Override
public <T, E extends Throwable> boolean open(RetryContext context, RetryCallback<T, E> callback) {
log.info("DefaultListenerSupport open");
return super.open(context, callback);
}
}
и строительствоRetryTemaplate
Установить времяwithListener
поле.
@Bean
@ConditionalOnMissingBean
public RetryListenerSupport retryListenerSupport(){
return new DefaultListenerSupport();
}
@Bean
@ConditionalOnMissingBean
public RetryTemplate retryTemplate(RetryListenerSupport retryListenerSupport){
...
return RetryTemplate.builder()
.customPolicy(simpleRetryPolicy)
.customBackoff(fixedBackOffPolicy)
.withListener(retryListenerSupport)
.retryOn(CustomRetryException.class)
.build();
}
Запустите модульный тест, и результат будет следующим.
6. Резюме
В этой статье мы увиделиSpring retry
различные функции, мы знаем, что их использование делает приложение более надежным. мы практикуемсяSpring Retry
Наиболее распространенные варианты использования включают@Retryable
Примечания иRetryTemplate
.
Итак, где мы можем использоватьSpring Retry
Шерстяная ткань? Есть два предложения
- Используйте повторы только для временных ошибок. Не рекомендуется использовать его при постоянных ошибках, так как это может привести к проблемам с производительностью системы.
- Это не замена фьюзам, по возможности лучше использовать и фьюзы, и повторители.
Мальчик, ты не можешь видеть достаточно? нажмите на каменьПодробное описание, Просто нажмите и посмотрите, может быть будут сюрпризы? Добро пожаловать в поддержкуНравится/Подписывайтесь/Комментируйте, ваша поддержка — моя самая большая мотивация для Gengwen, спасибо!