Hystrix超时熔断部分源码

1. AbstractCommand

因为hystrix的命令执行都是基于RXjava的,所以在看源码之前一定要先了解RXjava。
HystrixCommand继承了AbstractCommand,HystrixCommand主要是提供了更多的构造函数和构造参数建造者以及最终调用run()实现用户业务,而AbstractCommand中就是要实现隔离、熔断等核心功能

2. 超时入口

hystrix超时入口是在AbstractCommand类中。是在com.netflix.hystrix.AbstractCommand.executeCommandAndObserve方法中进行是否开启超时熔断的判断的。
在这里插入图片描述
在这里插入图片描述
而这个executionTimeoutEnabled配置是从properties属性中取的,可以看到这个属性的值来源于com.netflix.hystrix.HystrixCommandProperties#executionTimeoutEnabled。

com.netflix.hystrix.HystrixCommandProperties#executionTimeoutEnabled又是在构造HystrixCommandProperties对象时通过构造函数初始化的

this.executionTimeoutEnabled = getProperty(propertyPrefix, key, “execution.timeout.enabled”, builder.getExecutionTimeoutEnabled(), default_executionTimeoutEnabled);

在这里插入图片描述
因此就能知道,这个属性的赋值是由我们代码中通过继承com.netflix.hystrix.HystrixObservableCommand类,传入com.netflix.hystrix.HystrixCommandProperties.Setter对象初始化的
在这里插入图片描述
所以在代码中通过setter.withExecutionTimeoutEnabled(true);来打开超时熔断的开关。

3. 判断超时的逻辑

当我们的代码执行的时候会回调HystrixObservableTimeoutOperator.call()方法,超时的逻辑主要在这个方法中。
在这里插入图片描述
在这里插入图片描述

4. 创建一个监听器

在这里插入图片描述
监听器就是来监听我们的command是否超时

5. TimerListener.tick()入线程池

在这里插入图片描述
final Reference tl = HystrixTimer.getInstance().addTimerListener(listener);
获取单例的HystrixTimer,这里面维护了一个线程池ScheduledThreadPoolExecutor
在这里插入图片描述
构建了一个线程池ScheduledThreadPoolExecutor,默认的coreSize=8。

ScheduledThreadPoolExecutor的状态管理、入队操作、拒绝操作等都是继承于 ThreadPoolExecutor;ScheduledThreadPoolExecutor 主要是提供了周期任务和延迟任务相关的操作;

在这里插入图片描述
HystrixTimer.addTimerListener() 这个方法会把之前创建好的TimerListener加入HystrixTimer中,并把TimerListener.tick()封装为一个Runnable扔到线程池里。

listener.getIntervalTimeInMilliseconds()这个参数就是我们设置的超时时间,所以这个任务会在我们设置的超时时间(hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds)之后运行,来判断timedOutStatus的状态。

6. 执行业务逻辑

在这里插入图片描述
若执行时间超过(hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds),command的TimedOutStatus状态则为NOT_EXECUTED,会在后续TimerListener.tick()方法内部执行if判断的时候,进入方法内部。

7. TimerListener.tick()方法

在这里插入图片描述
通过tick()方法判断我们的任务是否超时。

判断当前command的TimedOutStatus是否是NOT_EXECUTED,如果是,则认为超时了,就把状态设置为TIMED_OUT,并抛出HystrixTimeoutException异常,如果不是的话,则什么都不做。

8. HystrixTimeoutException异常

在这里插入图片描述
在这里插入图片描述

9. 清理任务

在这里插入图片描述
f.cancel()就是清理Runnable的任务

10. 总结

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值