2015-07-13 4 views
1

У меня есть два api для вызова. как они обернуты Hystrix Observable:Как составить Hystrix наблюдаемые с помощью java8 и rxjava

здесь один, например:

@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(); 

и заполнить конечный результат (FlightDetails) us ING в Observable.zip

FlightDetails:

public class FlightDetails { 

    String couponId; 
    String availableFlightList; 

.. 
} 

Спасибо, луч.

ответ

1

Сначала сделайте свой Hystrix команды класса А @Component, так как вы используете Spring, то просто Autowire его в YOUT контроллера и вызвать

и используя лямбды, будет выглядеть примерно так:

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; 
} 
+0

BTW Если вы просто хотите создать новый экземпляр «FlightDetails», вы можете использовать ссылку на метод вместо lambda –

+0

Не могли бы вы объяснить, почему использование DeferredResult? – rayman

+0

И смысл использования (доступный, купон). – rayman

1

Я не знаком с 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(); 
Смежные вопросы