#spring-boot #spring-retry
Вопрос:
У меня странная проблема с аннотацией @Retryable.
Предполагается, что он запускается только с определенными классами исключений для свойства value:
@Retryable(value = {IllegalArgumentException.class}, maxAttempts = 2, backoff = @Backoff(delay = 50))
Но его увольняют с любым исключением:
org.springframework.retry.ExhaustedRetryException: Cannot locate recovery method; nested exception is org.springframework.web.client.HttpClientErrorException$Forbidden: 403 : "{"timestamp":"2021-11-13T16:46:32.842 00:00", ---SO ON---
Все документы, которые я вижу, говорят, работают только с исключениями, указанными в свойстве value.
Есть какие-нибудь идеи?
С уважением
отредактированный:
По просьбе @Hans-Christian это код:
@Retryable(value = {IllegalArgumentException.class}, maxAttempts = 2, backoff = @Backoff(delay = 50)) public ResponseEntitylt;Objectgt; subscriptionGet(UUID subscriptionId){ ResponseEntity response = restTemplate.getForEntity(USER_SUBSCRIPTION_GET_ID_URL, SubscriptionResponse.class, subscriptionId); return response; } @Recover public ResponseEntitylt;Objectgt; recoverSubscriptionGet(IllegalArgumentException e, UUID subscriptionId){ log.error("Unable to reach service: {}", e.getMessage()); return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE); }
В случае другого рода исключений, например HttpClientErrorException.Forbidden
, при повторной попытке срабатывает и теряется много времени, пытаясь найти это восстановление
Ответ №1:
Судя по сообщению об ошибке Cannot locate recovery method
, похоже, что вы добавили аннотацию @Recover
к другому методу с другим возвращаемым значением.
В этом случае либо выровняйте возвращаемое значение вашего @Recover
метода так, чтобы оно совпадало с методом, с аннотацией @Retryable, либо удалите метод восстановления.
Пример:
@Retryable(value = {IllegalArgumentException.class}, maxAttempts = 2, backoff = @Backoff(delay = 50)) private String doSomething() throws Exception { // return value is a String } @Recover void recoverSomething(IllegalArgumentException e) { // this method does not return a String }
Комментарии:
1. Это не так, есть только один
@Retryable
и только один@Recover
. Дело в том, что эта повторная попытка происходит независимо от класса исключений, определенного в значении, и я хочу повторить попытку только в том случае, если это так (только исключение IllegalArgumentException).2. хорошо, можете ли вы поделиться кодом, как определяются методы повторной проверки и восстановления?
3. Поделился @Ханс-Кристиан