Нужен ли метод @Recovery при использовании Spring-Retry?

У меня вопрос по поводу весеннего повтора. Предположим простой пример кода, где у меня есть слой Service и класс Controller.,

Это интерфейс testService

public interface testService{
   @Retryable(value = { KnownExceptiomn.class }, backoff = @Backoff(delay = 1000), maxAttempts = 2)
   Address getAddress(String emailAddress);
}

Это реализация сервиса

public class testServiceImpl{
public Address getAddress(String emailAddress){
   //addressRepository is a crud repository
   return addressRepository.getAddressFromEmail(emailAddress);
   }
}

И контроллер есть

    @GetMapping("path/{emailId}")
    public ResponseEntity<?> getAddress(@PathVariable("emailId") final String email){
      final Address address;
      try{
        address= testService.getAddress(String emailAddress);
        if(address != null) return new ResponseEntity<Address>(address,HttpStatus.OK);

        return new ResponseEntity<String>("Invalid Email", HttpStatus.BAD_REQUEST);
        }catch(KnownException e){
   return errorMessage("Error");
       }

}

Как видно, @Retryble находится в интерфейсе сервиса. Однако я не реализовал метод @Recover. Я думал здесь о том, что у меня действительно нет никаких вторичных БД, и если БД не работает, там действительно нет опции восстановления, я не добавил метод @Recovery. Вместо этого исключение было перехвачено в контроллере и обработано.

Мои вопросы:

  1. Является ли вышеуказанный подход неправильным. Если так, то как это сделать правильно?
  2. Всегда ли нужно иметь метод восстановления? Если это так, что будет восстановление в таких сценариях, как БД не работает, и нет альтернативного источника данных.
  3. Разве неправильно отлавливать исключения в контроллере и обрабатывать их соответственно? (Мне сказали, что служба поддержки должна обрабатывать все исключения в некоторых обсуждениях).

    Везде, где я вижу, есть какой-то метод восстановления, но я не смог найти надежного примера с подходящим обработчиком восстановления для этого типа сценария, если он есть.

2 ответа

@Recovery необязательно; если его нет, после того, как повторные попытки исчерпаны, последнее исключение выдается вызывающей стороне, которая должна обработать исключение.

Это совершенно нормально, чтобы не иметь @Recovery и обработать исключение в вызывающей стороне любыми способами, которые вам нравятся.

@Vipin Menon: Я думаю, вы имеете в виду аннотацию, поэтому ответ - нет. Аннотация предоставляется только для того, чтобы дать программисту гибкость в создании метода восстановления, чтобы вернуть ответ по умолчанию (резервный), если попытки повторной попытки также не удались.

Короче говоря, не создавайте метод восстановления, используя @Recoverаннотации, если вам не нужно поведение по умолчанию при неудачных попытках повторения. Просто используйте @Retryable аннотация к фактическому методу обслуживания.

Другие вопросы по тегам