Reactor WebClient - PullRequest
       16

Reactor WebClient

0 голосов
/ 15 октября 2018

У меня есть нижеследующая функция Handler, которая принимает POST-запрос «BookingRecord».Я получаю Mono из ServerRequest с помощью bodyToMono (), а затем подписываюсь на Mono, так как мне нужен тип BookingRecord, чтобы вызвать REST-сервис для возврата Mono "", используя WebClient.Я объявил стоимость в качестве переменной экземпляра, чтобы использовать ее в операторе возврата.

public class BookingHandler
{
   private Mono<Fare>           fare;
   private WebClient            webClient= = WebClient.create("http://localhost:8080");

   public HandlerFunction<ServerResponse> book = request -> {

    request.bodyToMono(BookingRecord.class)
            .subscribe(br ->
            {
                fare = this.webClient.get()
                        .uri("/fares/get/{flightNumber}/{flightDate}", br.getFlightNumber(), br
                                .getFlightDate())
                        .retrieve()
                        .bodyToMono(Fare.class);
            });
    return ServerResponse.ok()
            .body(BodyInserters.fromPublisher(fare, Fare.class));
};
}

Но этот код не работает.Подписка не выполняется !!Почему это так?

Мне пришлось изменить его на приведенный ниже код, чтобы он работал !.

 request.bodyToMono(BookingRecord.class)
                        .subscribe(br ->
                    {
                    flightNumber = br.getFlightNumber();
                    flightDate = br.getFlightDate();
                });

        fare = this.webClient.get()
                .uri("/fares/get/{flightNumber}/{flightDate}", flightNumber, flightDate)
                .retrieve()
                .bodyToMono(Fare.class);

Так почему мой первый код не вызывает подписку?Я использую SpringBoot 2.1.0.M4.

1 Ответ

0 голосов
/ 15 октября 2018

За кулисами вы уже подписываетесь, ожидая результата, так что нет никакой необходимости подписываться снова.Вы должны рассматривать каждый шаг как строительный блок, поэтому сначала вы получите запись бронирования (1), когда она будет завершена, затем создайте URL с записью (2), а затем запросите URL (3), когда это будет завершено, вернитесьтело ответа (4).Вам нужно собрать каждый из них в один поток (5).Ваш второй пример сработал, потому что вам повезло, что подписка завершилась до того, как вы создали URL-адрес, или потому, что она была заполнена в другом исполнении.

public HandlerFunction<ServerResponse> book = request -> request.bodyToMono(BookingRecord.class) //(1)
                .map(br -> this.webClient.get()
                        .uri("/fares/get/{flightNumber}/{flightDate}", br.getFlightNumber(), br
                                .getFlightDate()) //(2)
                        .retrieve() (3)
                        .bodyToMono(Fare.class) (4)
                ).flatMap(fare -> ServerResponse.ok().body(BodyInserters.fromPublisher(fare, Fare.class))) (5)

;
...