欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-20 22:19:04
...

一、说明

@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  

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

相关标签: Hystrix超时时间