@Retryable -> свойство value работает не так, как ожидалось

#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. Поделился @Ханс-Кристиан