1

I am getting intermittent ReadTimeOut from netty with the below error:

The connection observed an error","logger_name":"reactor.netty.http.client.HttpClientConnect","thread_name":"reactor-http-epoll-3","level":"WARN","level_value":30000,"stack_trace":"io.netty.handler.timeout.ReadTimeoutException: null

One observation we made is this particular endpoint for which we are getting this issue is a POST with no request body. I am now sending a dummy json in body now which the downstream system ignores and now I don't see this error anymore at all.

Below is my code:

       protected <T, S Mono<S sendMonoRequest (HttpMethod method,
            HttpHeaders headers,
            T requestBody,
            URI uri, Class < S responseClass)
                 throws ApiException, IOException {

        log.info("Calling {} {} {} {}", method.toString(), uri.toString(), headers.toString(),
                mapper.writeValueAsString(requestBody));

        WebClient.RequestBodySpec requestBodySpec = getWebClient().method(method).uri(uri);
        headers.keySet().stream().forEach(headerKey -> headers.get(headerKey).stream().
                forEach(headerValue -> requestBodySpec.header(headerKey, headerValue)));
        return requestBodySpec
                .body(BodyInserters.fromObject(requestBody != null ? requestBody : ""))
                .retrieve()
                .onStatus(HttpStatus::is4xxClientError, this::doOn4xxError)
                .onStatus(HttpStatus::is5xxServerError, this::doOn5xxError)
                .onStatus(HttpStatus::isError, this::doOnError)
                .bodyToMono(responseClass);
    }

    protected WebClient getWebClient () {

        HttpClient httpClient = HttpClient.create().tcpConfiguration(
                client -> client.option(ChannelOption.CONNECT_TIMEOUT_MILLIS,
                        20000).doOnConnected(conn - conn
                        .addHandlerLast(new ReadTimeoutHandler(20)).addHandlerLast(new WriteTimeoutHandler(20))));

        ClientHttpConnector connector = new ReactorClientHttpConnector(httpClient);

        return WebClient.builder().clientConnector(connector)
                .filter(logResponse())
                .build();
    }

 

To resolve the intemrittent timeouts, I have to send a dummy pojo to sendMonoRequest() for request body. Any ideas ?

Michael McFadyen
  • 2,675
  • 11
  • 25
T Anna
  • 874
  • 5
  • 21
  • 52

0 Answers0