what is wrong with below webclient config?

I am facing connection error. Log entries are readAddress(..) failed: Connection reset by peer; nested exception is io.netty.channel.unix.Errors$NativeIoException: readAddress(..) failed: Connection reset by peer the connection observed an error Pending acquire queue has reached its maximum size of 1000; nested exception is reactor.netty.internal.shaded.reactor.pool.PoolAcquirePendingLimitException

Webclient config is:

@Bean
public WebClient webClient(@Autowired ObjectMapperBean objectMapperBean) {
        ConnectionProvider provider =
                ConnectionProvider
                        .builder("custom")
                        .maxConnections(500)
                        .build();

        HttpClient httpClient = HttpClient.create(provider);

        ExchangeStrategies exchangeStrategies =
                ExchangeStrategies
                        .builder()
                        .codecs(codecConfigurer -> codecConfigurer
                                .defaultCodecs()
                                .jackson2JsonEncoder(new Jackson2JsonEncoder(objectMapperBean.getObjectMapper(), MediaType.APPLICATION_JSON)))
                        .build();

        return WebClient
                .builder()
                .clientConnector(new ReactorClientHttpConnector(httpClient))
                .exchangeStrategies(exchangeStrategies)
                .build();
    }

I am not sure where the problem is. Can someone help me on this? #springboot #webclient

Upvotes: 3

Views: 6362

Answers (1)

Poorvi
Poorvi

Reputation: 121

By default the number of pending queue requests allowed for a reactor netty server is

2 * number of connections

if not provided explicitly. You need to take care of these configuration on the basis of your throughput expectations. You can modify this property as follows :

ConnectionProvider.builder(CONNECTION_NAME)
        .maxConnections(<MaxConnectionThreads>)
        .pendingAcquireTimeout(Duration.ofMillis(<PendingAcquireTimeout>))
        .pendingAcquireMaxCount(<maxCount>)
        .maxIdleTime(Duration.ofMillis(<MaxIdleTime>))
        .build();

Upvotes: 3

Related Questions