@HystrixCommand 注解的作用与注意事项

  • Post author:
  • Post category:其他

一、说明

@HystrixCommand 注解 能对某个一个接口定制 Hystrix的超时时间。

通过修改 execution.isolation.thread.timeoutInMilliseconds 属性可以设置超时时间,

通过设置 fallbackMethod 可以设置超时后响应的格式

 

二、示例

 

 @HystrixCommand(fallbackMethod = "sleepFallback", commandProperties =
            {
                    @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "900")
            })
@PostMapping("/sleep")
public ResultBean test(@RequestParam(value = "sleep") Integer sleep) throws InterruptedException {
        log.info("开始睡眠" + sleep + "毫秒");
        Thread.sleep(sleep);
        log.info("睡眠结束...");
        return ResultBean.result("请求结束!");
}

private ResultBean sleepFallback(Integer sleep) {
        return ResultBean.result(Code.REQUEST_TIME_OUT.getCode(), "请求超时,请稍后重试。");
}

三、注意事项

① 设置 fallbackMethod 指定的 返回值方法类型要跟目标方法一致,否则将报错。

② 如果方法内部有明显的异常,将不走目标方法,直接返回 fallback 方法的返回值。

 @HystrixCommand(fallbackMethod = "sleepFallback", commandProperties =
            {
                    @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000")
            })
@PostMapping("/sleep2")
public ResultBean test02(@RequestParam(value = "sleep") Integer sleep) throws InterruptedException {
        log.info("开始睡眠" + sleep + "毫秒");
        String s = null;
        s.trim();//编译通过,但明显空指针异常
        int i = 1 / 0;编译通过,但明显算术异常
        Thread.sleep(sleep);
        log.info("睡眠结束...");
        return ResultBean.result("请求结束!");
}

③ 如果@HystrixCommand 注解同时指定了目标方法的 timeoutInMilliseconds,同时又在配置文件 application.yml 中配置了hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds ,甚至设置了Ribbon.ReadTimeout  

那么,超时时间最小的将生效。


版权声明:本文为qq_26820793原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。