Webflux WebClient Асинхронный запрос и обработка Mono - PullRequest
0 голосов
/ 09 января 2019

Я новичок в Webflux и не могу найти подходящий материал для продолжения реализации.

Я хочу отправить запрос и обработать ответ асинхронно. В этом случае вызов службы занимает около 8-10 мс, чтобы ответить, поэтому мы выдаем запрос и продолжаем выполнять другую работу, и ищем ответ, когда он необходим для дальнейшей обработки.

Mono<Map<String,Price>> resp = webClient.post()
.uri("/{type}",isCustomerPricing ? "customer" : "profile")
.body(Mono.just(priceDetailsRequest),PriceDetailsRequest.class)
.retrieve().bodyToMono(customerPriceDetailsType);

Как сделать так, чтобы этот вызов выполнялся асинхронно в другом потоке (я пробовал subscriberOn с Schedulers.single / Scheuldes.parallel), но не видел, чтобы этот вызов выполнялся, пока не будет вызван Mono.block ().

Как нам достичь?

  1. Мы хотим, чтобы этот вызов выполнялся параллельно в отдельном потоке, поэтому текущий поток может продолжить другую работу
  2. Когда обработка завершится, установите ответ для контекста
  3. Когда текущий поток ищет ответ, если служба не завершено, заблокировать до завершения вызова

1 Ответ

0 голосов
/ 10 января 2019

Вам не нужно блокировать использование ответа. Просто назначьте оператора для использования ответа в той же цепочке. Пример приведен ниже.

Mono<Map<String,Price>> resp = webClient.post()
        .uri("/{type}",isCustomerPricing ? "customer" : "profile")
        .body(Mono.just(priceDetailsRequest),PriceDetailsRequest.class)
        .retrieve()
        .bodyToMono(CustomerPriceDetailsType.class)
        .map(processor::responseToDatabaseEntity) // Create a persistable entity from the response
        .map(priceRepository::save)               // Save the entity to the database
        .subscribe();                             //This is to ensure that the flux is triggered.

В качестве альтернативы вы можете указать потребителя в качестве параметра метода subscribe().

...