Как объединить два асинхронных вызова веб-клиента, предположим, если один вызов столкнулся с каким-то исключением - PullRequest
1 голос
/ 02 июня 2019

Я использую весеннюю загрузку 2.x и выполняю два асинхронных вызова с использованием веб-клиента. Я получаю правильный ответ одним вызовом, в то время как другой вызов сталкивается с некоторым исключением. Я хочу сжать оба ответа вместе, используя метод zip, но при использовании блока с zip он генерирует исключения и потоки управления для захвата блока. Я хочу, чтобы оба ответа были заархивированы, за исключением одного или обоих. Пожалуйста, объясните мне, как это сделать.

Mono<BookResponse>  bookResponseMono =webClient.get()
           .uri("/getBooking/" + bookingId).headers(headers->headers.addAll(args) 
           .retrieve()
           .bodyToMono(BookResponse.class);// with proper responce
Mono<Address>  addressResponseMono =webClient.get()
           .uri("/getAddress/" + bookingId)
           .headers(headers->headers.addAll(args))
           .retrieve()
           .bodyToMono(Address.class);// encounter readtimeout exception

Tuple2<BookResponse, Address> resp = bookResponseMono.zipWith(addressResponseMono).block();// throws exception but 

Я хочу сжать оба ответа вместе с исключением.

1 Ответ

0 голосов
/ 08 июня 2019

onErrorResume работал для меня над вышеуказанной проблемой.

bookResponseMono = webClient.get()
    .uri("/getBooking/" + bookingId)
    .headers(headers->headers.addAll(args))
    .retrieve()
    .bodyToMono(String.class)
    .onErrorResume(err -> {
        BookResponse bookResponse = new BookResponse();
        bookResponse.setError(setError(err));
        return Mono.just(setError(err));
    });

addressResponseMono = webClient.get()
    .uri("/getAddress/" + bookingId)
    .headers(headers -> headers.addAll(args))
    .retrieve()
    .bodyToMono(String.class)
    .onErrorResume(err -> {
        Address address = new Address();
        address.setError(setError(err));
        return Mono.just(setError(err));
    });

Застегнуться наконец

bookAndAddressResponse = bookResponseMono
    .zipWith(addressResponseMono, BookAndAddressResponse::new)
    .block();
...