Как обработать асинхронный ответ от WebClient? - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь использовать WebClient для выполнения массивного запроса POST Http. Я установил уровень ведения журнала на reactor.ipc.netty для DEBUG, чтобы увидеть отправку запроса.

Вот действующий код:

@Service
public class HttpService implements IHttpService {

    private static final String URL = "http://blablabla.com/bla";

    private static final Logger logger = LogManager.getLogger();

    @Autowired
    WebClient webClient;

    @Override
    public void push(Data data) {
        String body = constructString(data);
        Mono<ClientResponse> res = webClient.post()
                .uri(URL + getLogType(data))
                .contentLength(body.length())
                .contentType(MediaType.APPLICATION_JSON)
                .syncBody(body)
                .exchange();
        ClientResponse resp = res.block();
        logger.debug("Status : " + resp.statusCode());
        logger.debug("Body : " + resp.bodyToMono(String.class));
    }
}

Выдает такой журнал:

2018-05-16 15:54:14.642 DEBUG 19144 --- [ctor-http-nio-4] r.i.n.channel.ChannelOperationsHandler   : [id: 0x439f7819, L:/127.0.0.1:56556 - R:blablabla.com/127.0.0.1:8069] Writing object DefaultHttpRequest(decodeResult: success, version: HTTP/1.1)
POST /bla HTTP/1.1
user-agent: ReactorNetty/0.7.7.RELEASE
host: blablabla.com/bla:8069
accept: */*
accept-encoding: gzip
Content-Length: 494
Content-Type: application/json

Но когда я удаляю ClientResponse resp = res.block();, я больше не вижу журнал ... Так что я даже не знаю, обработан запрос или нет. Как я могу обработать ответ, как только я его получу? Я пытался с res.doOnSuccess(clientResponse -> logger.debug("Code : " + clientResponse.statusCode()));, но безуспешно ...

1 Ответ

0 голосов
/ 17 мая 2018

Поскольку Flux и Mono являются типами Reactive Streams, они также ленивы: ничего не происходит, пока вы не subscribe с ним.Есть несколько методов, которые могут достичь этой цели, и среди них есть subscribe или block.

Обычно приложения Spring WebFlux не subscribe напрямую и фактически возвращают эти реактивные типы;без большего контекста в вашем случае, я не могу действительно сказать, какой подход был бы здесь правильным.должен помочь вам понять основные принципы, стоящие за этим.

...