1. 程式人生 > >hystrix(6) 命令執行

hystrix(6) 命令執行

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) 命令執行