我在做项目的时候发现远程调用了一个服务,但是服务的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.直接不处理异常
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐