hystrix(6) 命令執行
阿新 • • 發佈:2018-11-29
mman ide 四種 onu ... def override ply pre
上一節中講到了HystrixCommand有四種執行方法,這一節就來講一下這四種方法直接的關系以及他們的實現。
execute方法使用同步方式獲取結果,本質是調用了queue方法獲取了一個Future,然後通過該Future獲取返回結果。
public R execute() { try { return queue().get(); } catch (Exception e) { throw Exceptions.sneakyThrow(decomposeException(e)); } }
queue方法通過異步方式活動結果,本質是通過toObservable方法獲取了一個Observable,然後通過該Observable獲得一個Future
public Future<R> queue() { ... final Future<R> delegate = toObservable().toBlocking().toFuture(); ... };
observe方法通過Observable實現異步,並且該Observable無論在任何時候監聽,都可以接收到所有消息。本質是使用了一個ReplaySubject監聽toObservable返回的Observable,然後再返回該ReplaySubject。
public Observable<R> observe() {
ReplaySubject<R> subject = ReplaySubject.create(); final Subscription sourceSubscription = toObservable().subscribe(subject); ... return subject.doOnUnsubscribe(new Action0() { @Override public void call() { sourceSubscription.unsubscribe(); } }); }
toObservable方法Observable實現異步,在Observable被監聽時執行。本質是創建一個Observable,當這個Observable被監聽時,執行run命令,並返回消息。
public Observable<R> toObservable() { ... return Observable.defer(new Func0<Observable<R>>() { @Override public Observable<R> call() { ... Observable<R> hystrixObservable = Observable.defer(applyHystrixSemantics) //會調用run方法 .map(wrapWithAllOnNextHooks); ... } }); }
hystrix(6) 命令執行