Hystrix的四种调用方法有何异同?
众所周知,Hystrix一共提供了4种调用方法供以使用:
toObservable() :未做订阅,只是返回一个Observable
observe():调用 #toObservable() 方法,并向 Observable 注册,rx.subjects.ReplaySubject发起订阅,因此它具有回放的能力
observe() 方法使用了ReplaySubject缓存了toObservable的消息,使得执行后再监听也可以收到所有消息。新订阅者连历史数据也能够监听到(1分钟内)
queue():调用toObservable().toBlocking().toFuture()返回 Future 对象
execute():调用#queue() 方法的基础上,马上调用 Future#get() 方法,同步返回 #run() 的执行结果。
observe() vs toObservable()
四种调用方法中,最难区分的当属observe() 和oObservable()了,这里做进一步的解释说明和对比。
observe()和toObservable()虽然都返回了Observable对象,但是observe()返回的是Hot Observable,该命令会在observe()调用的时候立即执行,当Observable每次被订阅的时候会重放他的行为;
而toObservable()返回的是Cold Observable,toObservable()执行之后,命令不会被立即执行,只有当所有订阅者都订阅它之后才会执行。
execute()、queue()也都使用了RxJava来实现,并且queue()是通过toObservable()来获得一个Cold Observable(不会立马执行),并且通过toBlocking()将该Observable转换成BlockingObservable,它可以把数据以阻塞的方式发出来,而toFuture方法则是把BlockingObservable转换成一个Future,该方法只是创建一个Future返回,并不会阻塞,这使得消费者可以自己决定如何处理异步操作。
说明:Future实例出来后,目标方法是立马执行的,只是它不会阻塞主线程,并且执行结果你可以在其它地方get获取(若还没执行完成时去get,会阻碍)