Spring WebClient抛出javax.net.ssl.SSLException:大量使用时SSLEngine已关闭

时间:2018-11-04 09:21:48

标签: netty spring-webflux sslengine

那是我的代码:

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)

我同时从多个线程调用此函数。 当我在一次运行中只调用20到30次左右时,效果很好。但是当我在大约2分钟内(指向相同的网址)调用500〜600次时,它会抛出

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

编辑

我尝试仅创建WebClient的一个实例,但它仍会引发相同的异常

3 个答案:

答案 0 :(得分:0)

多次调用WebClient.create()会创建并初始化HTTP资源。

由于没有关于此特定问题的更多详细信息或完整的堆栈跟踪,因此很难在此处确定确切的问题。但是我怀疑为每个调用创建客户端HTTP连接器很浪费,并且可能会导致在客户端设置SSL的问题。

您可以尝试:

WebClient webClient = WebClient.create();
// then in your for loop
webClient.post() //...

如果您使用的是Spring Boot,则应该注入一个WebClient.Builder实例,并使用它来创建一个WebClient实例。

答案 1 :(得分:0)

我遇到了同样的问题,就像OP提到的那样,它在负载下发生,但是在服务器负载下,它也很容易被“ nginx -s reload”触发。我在nginx论坛上发布了此消息,但到目前为止https://forum.nginx.org/read.php?2,281786尚无回复。就我而言,我正在使用一个单例客户端实例来处理多个请求,因此我认为Brian's评论不适用。

答案 2 :(得分:0)

我发现这是由于https://github.com/reactor/reactor-netty/issues/413这个问题引起的

要解决此问题,您需要像这样创建WebClient

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

您可以通过使用第二个参数调用PoolResources.fixed来更改池的大小

另一种解决方案是用另一个https://github.com/AsyncHttpClient/async-http-client

替换此异步http客户端。