如何使得全局异常不会捕获到openfeign降级异常
·
我在做项目的时候发现远程调用了一个服务,但是服务的url是不可连接的
正常情况下写了一个降级处理,就是返回所有属性为空,但是这个降级异常被全局异常捕获了,导致程序报错,这个怎么解决
首先,创建一个实现FallbackFactory接口的类,该类会生成降级处理对象:
@Component
public class MyFeignClientFallbackFactory implements FallbackFactory<MyFeignClient> {
@Override
public MyFeignClient create(Throwable cause) {
return () -> {
// 降级逻辑,返回备用数据
return "Fallback Data";
};
}
}
然后,在你的OpenFeign接口上使用fallbackFactory属性,指定降级处理生成的工厂类:
@FeignClient(name = "myFeignClient", url = "http://unreachable-ip", fallbackFactory = MyFeignClientFallbackFactory.class)
public interface MyFeignClient {
@GetMapping("/remoteEndpoint")
String makeRemoteCall();
}
最后,在全局异常处理类上处理特定的异常。在这个处理类中,你可以忽略降级处理相关的异常,使得降级逻辑生效:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(FeignException.class)
public ResponseEntity<Object> handleFeignException(FeignException ex,HttpServletRequest request) {
System.out.println("Feign调用出现异常,异常路径为:"+request.getRequestURL()+"异常信息为"+ex.getMessage());
// 处理异常逻辑
}
}
一般这段代码有全局异常处理器超时会执行降级还是被捕获
答案是:
通常情况下,降级逻辑是为了应对服务调用时可能出现的特定问题,例如远程服务不可用或响应时间过长。如果全局异常处理器捕获了超时异常并处理了它,那么降级逻辑通常不会触发
要确保降级逻辑在超时情况下执行,可以在全局异常处理器中判断异常类型并选择是否执行降级逻辑。例如,在捕获到超时异常时,可以选择触发降级逻辑,而在其他异常情况下,可以让全局异常处理器处理它们,但是之后的代码不会执行
也可以直接再次抛出异常
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(FeignException.class)
public ResponseEntity<Object> handleFeignException(FeignException ex,HttpServletRequest request) {
throw ex;
}
}
还可以try-catch如图:
//"对象" a = new "对象" ();
try {
//使用feign进行赋值
} catch (Exception e) {
//失败自定义降级及返回所有属性为空的对象
}
总结
当openfiegn遇上全局异常处理器
1.将全局处理器取消
2.开始创建好对象,出现异常了自动返回所有属性为空的对象
3.保证服务正常有数据就行
4.直接不处理异常
更多推荐

所有评论(0)