Spring WebClient throws javax.net.ssl.SSLException: SSLEngine closed already when used heavily

AvielNiego picture AvielNiego · Nov 4, 2018 · Viewed 9.6k times · Source

That's my code:

WebClient.create().post()
                .uri(URI.create(url))
                .header("Authorization",
                        "Basic " + Base64Utils.encodeToString(("username:password").getBytes(UTF_8)))
                .body(Mono.just(requestBody), Object.class)
                .retrieve()
                .bodyToMono(responseType)

I call this function from multiple threads at the same time. When I only call it around 20~30 times in a single run it works perfectly fine. But when I call it 500~600 times in around 2 minutes (to the same URL) it throws

javax.net.ssl.SSLException: SSLEngine closed already
    at io.netty.handler.ssl.SslHandler.wrap(...)(Unknown Source)

EDIT

I've tried creating only one instance of WebClient but it still throws the same exception

Answer

AvielNiego picture AvielNiego · Nov 7, 2018

I found out this is happening due to this issue https://github.com/reactor/reactor-netty/issues/413

To resolve it you need to create WebClient like that:

WebClient webClient = WebClient.builder()
               .clientConnector(new ReactorClientHttpConnector(options -> {
                   options.poolResources(PoolResources.fixed("httpPool")).compression(true);
               })).build();

you can change the pool size by calling PoolResources.fixed with its second parameter

Another solution is to replace this Async http client with another one like this one https://github.com/AsyncHttpClient/async-http-client