如果您的应用程序是用RxJava设计的,那么涉及第三方服务或未知库的操作可能已经被建模为Observables. 。基本的HystrixCommand只支持阻塞代码。如果你与外界的交互已经是Observable,而你想通过Hystrix进一步的保护,那么,HystrixObservableCommand就更合适了:
public class CitiesCmd extends HystrixObservableCommand<Cities> {
private final MeetupApi api;
private final double lat;
private final double lon;
protected CitiesCmd(MeetupApi api, double lat, double lon) {
super(HystrixCommandGroupKey.Factory.asKey("Meetup"));
this.api = api;
this.lat = lat;
this.lon = lon;
}
@Override
protected Observable<Cities> construct() {
return api.listCities(lat, lon);
}
}
MeetupApi是在280页的“etrofit with Native RxJava Support”中引入的,它可以返回Observable<Cities>。Hystrix透明地将这一Observable包装起来,添加了我们很快会发现的容错功能。CitiesCmd命令比BlockingCmd更典型,因为它在构造函数中接受了一些参数。在单元测试中,我们还可以通过一个存根化的MeetupApi实例来验证命令的行为。
HystrixObservableCommand对于HystrixCommand的优点是前者不需要线程池来操作。HystrixCommand总是在绑定的线程池中执行,而Observable 命令不需要额外的线程。当然,从construct()返回的Observable (注意到它不再被命名为run())仍然可以使用一些线程,这取决于底层实现。
知道如何在Hystrix中创建命令以及如何将它们放入RxJava生态系统中,是时候看看Hystrix实际上提供了哪些特性