Rx java 如何使用java8和rxjava组合Hystrix观测值

Rx java 如何使用java8和rxjava组合Hystrix观测值,rx-java,hystrix,Rx Java,Hystrix,我有两个api要调用。它们都用Hystrix Observable包裹: 这里有一个例子: @HystrixCommand() public Observable<String> getAvailableFlightBookings() { return new ObservableResult<String>() { @Override public String invoke() {

我有两个api要调用。它们都用Hystrix Observable包裹:

这里有一个例子:

@HystrixCommand()
    public Observable<String> getAvailableFlightBookings() {
        return new ObservableResult<String>() {
            @Override
            public String invoke() {
                URI uri = registryService.getServiceUrl("flight-booking-service", "http://localhost:8081/flight-booking-service");
                String url = uri.toString() + "/flights/list";
                ResponseEntity<String> resultStr = restTemplate.getForEntity(url, String.class);
                return resultStr.getBody();
            }
        };
    }
并使用Observable.zip填充最终结果对象(FlightDetails)

航班详情:

public class FlightDetails {

    String couponId;
    String availableFlightList;

..
}
谢谢,,
ray.

我对Hystrix不太熟悉,但压缩两个可观测数据应该与纯RxJava没有什么不同

Observable.zip(availableFlightBookings, couponId, new Func2<String, String, FlightDetails>() {
    @Override
    public FlightDetails call(String availableFlights, String coupon) {
        return new FlightDetails(availableFlights, coupon);
    }
}).subscribe();
Observable.zip(可用的灯光预订、couponId、新功能2(){
@凌驾
公共航班详情呼叫(字符串可用航班、字符串优惠券){
返回新航班详情(可用航班、优惠券);
}
}).subscribe();

由于您使用的是Spring,因此首先将您的Hystrix命令设置为class a
@组件,然后将其自动连接到您的控制器中并调用

使用lambdas时,会出现如下情况:

public DeferredResult<FlightDetails> getAllFlightDetails() {

    Observable<String> availableFlightBookings=flightBookingIntegrationService.getAvailableFlightBookings();
    Observable<String> couponId=couponIntegrationService.getCoupon();

    //Create a new DeferredResult
    DeferredResult<FlightDetails> result = new DeferredResult();

    Observable.zip(availableFlightBookings,couponId, (avaliable, coupon) -> {
     // do some logic here or just..
    return new FlightDetails(avaliable,coupon);
    }).subscribe(result::setResult,result::setErrorResult);
    return result;
}
公共延迟结果getAllFlightDetails(){ 可观测的availableFlightBookings=flightBookingIntegrationService.getAvailableFlightBookings(); Observable couponId=couponIntegrationService.get优惠券(); //创建一个新的延迟结果 DeferredResult=新的DeferredResult(); Observable.zip(可用的灯光预订、couponId(可用、优惠券)->{ //在这里讲点逻辑,或者。。 返回新航班详细信息(可用,优惠券); }).subscribe(result::setResult,result::setErrorResult); 返回结果; }
BTW如果您只想创建一个新的
FlightDetails
实例,您可以使用方法引用而不是lambdac。请解释为什么要使用延迟结果?以及使用(Available,优惠券)的意义。首先,因为您已经在使用,而且,这将触发spring的异步处理,因此,您不需要阻止Observable来获得结果,Spring Cloud将带来从控制器返回Observable的可能性,然后,您不需要延迟,这将由框架完成(可用,优惠券)只是您需要传递zip操作的函数参数的名称,因为我们使用的是Java8Lambdas,所以不需要匿名调用,您可以随意调用变量
Observable.zip(availableFlightBookings, couponId, new Func2<String, String, FlightDetails>() {
    @Override
    public FlightDetails call(String availableFlights, String coupon) {
        return new FlightDetails(availableFlights, coupon);
    }
}).subscribe();
public DeferredResult<FlightDetails> getAllFlightDetails() {

    Observable<String> availableFlightBookings=flightBookingIntegrationService.getAvailableFlightBookings();
    Observable<String> couponId=couponIntegrationService.getCoupon();

    //Create a new DeferredResult
    DeferredResult<FlightDetails> result = new DeferredResult();

    Observable.zip(availableFlightBookings,couponId, (avaliable, coupon) -> {
     // do some logic here or just..
    return new FlightDetails(avaliable,coupon);
    }).subscribe(result::setResult,result::setErrorResult);
    return result;
}