Hystrix超时入口是在 AbstractCommand
类中,如图:
Observable<R> execution; if (properties.executionTimeoutEnabled().get()) { execution = executeCommandWithSpecifiedIsolation(_cmd) .lift(new HystrixObservableTimeoutOperator<R>(_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);