我的问题是关于春季重试。假设我有一个简单的示例代码,其中我有一个服务层和控制器类。,
这是 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 方法。相反,异常被控制器捕获并处理。
我的问题是:
- 上述方法是否错误。如果是这样,如何以正确的方式做到这一点?
- 是否总是需要有恢复方法?如果是这样,在数据库关闭且没有其他数据来源的情况下,将如何恢复。
在控制器中捕获异常并相应地处理它们是错误的吗?(有人告诉我,服务人员应该处理一些讨论中的所有异常)。
我所看到的任何地方都是某种恢复方法,但如果有的话,找不到具有适当恢复处理程序的可靠示例。