Нужен ли метод @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. Вместо этого исключение было перехвачено в контроллере и обработано.
Мои вопросы:
- Является ли вышеуказанный подход неправильным. Если так, то как это сделать правильно?
- Всегда ли нужно иметь метод восстановления? Если это так, что будет восстановление в таких сценариях, как БД не работает, и нет альтернативного источника данных.
Разве неправильно отлавливать исключения в контроллере и обрабатывать их соответственно? (Мне сказали, что служба поддержки должна обрабатывать все исключения в некоторых обсуждениях).
Везде, где я вижу, есть какой-то метод восстановления, но я не смог найти надежного примера с подходящим обработчиком восстановления для этого типа сценария, если он есть.
2 ответа
@Recovery
необязательно; если его нет, после того, как повторные попытки исчерпаны, последнее исключение выдается вызывающей стороне, которая должна обработать исключение.
Это совершенно нормально, чтобы не иметь @Recovery
и обработать исключение в вызывающей стороне любыми способами, которые вам нравятся.
@Vipin Menon: Я думаю, вы имеете в виду аннотацию, поэтому ответ - нет. Аннотация предоставляется только для того, чтобы дать программисту гибкость в создании метода восстановления, чтобы вернуть ответ по умолчанию (резервный), если попытки повторной попытки также не удались.
Короче говоря, не создавайте метод восстановления, используя
@Recover
аннотации, если вам не нужно поведение по умолчанию при неудачных попытках повторения. Просто используйте
@Retryable
аннотация к фактическому методу обслуживания.