如何使用 java8 和 rxjava 组合 Hystrix observable
How to compose Hystrix observables using java8 and rxjava
我有两个 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();
}
};
}
我正在努力完成以下代码:
public DeferredResult<FlightDetails> getAllFlightDetails() {
//Calling previous defined functions
Observable<String> availableFlightBookings=flightBookingIntegrationService.getAvailableFlightBookings();
Observable<String> couponId=couponIntegrationService.getCoupon();
Observable<String> details = Observable.zip(
..?
}
我不确定如何调用以下 API:
flightBookingIntegrationService.getAvailableFlightBookings();
couponIntegrationService.getCoupon();
并使用 Observable.zip
填充最终结果对象 (FlightDetails)
航班详情:
public class FlightDetails {
String couponId;
String availableFlightList;
..
}
谢谢,
雷.
我不熟悉 Hystrix,但是压缩两个 observable 应该与纯 RxJava 没有什么不同。
Observable.zip(availableFlightBookings, couponId, new Func2<String, String, FlightDetails>() {
@Override
public FlightDetails call(String availableFlights, String coupon) {
return new FlightDetails(availableFlights, coupon);
}
}).subscribe();
首先让你的 Hystrix 命令 class 成为 @Component
,因为你正在使用 Spring,然后 Autowire
它进入你的控制器并调用
使用 lambda 表达式,看起来像这样:
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;
}
我有两个 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();
}
};
}
我正在努力完成以下代码:
public DeferredResult<FlightDetails> getAllFlightDetails() {
//Calling previous defined functions
Observable<String> availableFlightBookings=flightBookingIntegrationService.getAvailableFlightBookings();
Observable<String> couponId=couponIntegrationService.getCoupon();
Observable<String> details = Observable.zip(
..?
}
我不确定如何调用以下 API:
flightBookingIntegrationService.getAvailableFlightBookings();
couponIntegrationService.getCoupon();
并使用 Observable.zip
填充最终结果对象 (FlightDetails)航班详情:
public class FlightDetails {
String couponId;
String availableFlightList;
..
}
谢谢, 雷.
我不熟悉 Hystrix,但是压缩两个 observable 应该与纯 RxJava 没有什么不同。
Observable.zip(availableFlightBookings, couponId, new Func2<String, String, FlightDetails>() {
@Override
public FlightDetails call(String availableFlights, String coupon) {
return new FlightDetails(availableFlights, coupon);
}
}).subscribe();
首先让你的 Hystrix 命令 class 成为 @Component
,因为你正在使用 Spring,然后 Autowire
它进入你的控制器并调用
使用 lambda 表达式,看起来像这样:
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;
}