Hystrix超时入口是在 AbstractCommand 类中,如图:
Observableexecution; if (properties.executionTimeoutEnabled().get()) { execution = executeCommandWithSpecifiedIsolation(_cmd) .lift(new HystrixObservableTimeoutOperator (_cmd)); } else { execution = executeCommandWithSpecifiedIsolation(_cmd); } 复制代码
当我们的代码执行的时候会回调HystrixObservableTimeoutOperator.call()方法,超时的逻辑主要在这个方法中。
第一步: TimerListener listener = new TimerListener() 创建了一个监听器,很明显这个监听器就是来监听我们的command是否超时的,那它是怎么判断我们的任务是否超时了呢?我们看他的 tick() 方法。
if(originalCommand.isCommandTimedOut.compareAndSet(TimedOutStatus.NOT_EXECUTED, TimedOutStatus.TIMED_OUT)) {
// report timeout failure
originalCommand.eventNotifier.markEvent(HystrixEventType.TIMEOUT, originalCommand.commandKey);