Netty SpringWebClient抛出javax.net.ssl.SSLException:当大量使用时,SSLEngine已经关闭

Netty SpringWebClient抛出javax.net.ssl.SSLException:当大量使用时,SSLEngine已经关闭,netty,spring-webflux,sslengine,Netty,Spring Webflux,Sslengine,这是我的密码: WebClient.create().post() .uri(URI.create(url)) .header("Authorization", "Basic " + Base64Utils.encodeToString(("username:password").getBytes(UTF_8))) .body(Mono.just(req

这是我的密码:

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次(到同一个URL)时,它会抛出

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


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

调用
WebClient.create()
多次重复创建和初始化HTTP资源

如果没有关于这个特定问题的更多细节或完整的stacktrace,就很难在这里准确指出问题所在。但是我怀疑为每个调用创建一个客户端HTTP连接器是浪费,并且可能会导致在客户端设置SSL时出现问题

您可以尝试:

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

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

我也遇到过同样的问题,就像OP提到的那样,它发生在负载下,但在服务器负载下很容易被“nginx-s重载”触发。我在nginx论坛上发布了这篇文章,但到目前为止没有回复。在我的例子中,我对多个请求使用单例客户端实例,因此我认为注释不适用。

我发现这是由于这个问题

要解决此问题,您需要创建
WebClient
,如下所示:

WebClient webClient = WebClient.builder()
               .clientConnector(new ReactorClientHttpConnector(options -> {
                   options.poolResources(PoolResources.fixed("httpPool")).compression(true);
               })).build();
您可以通过调用
PoolResources.fixed
及其第二个参数来更改池大小


另一个解决方案是用另一个类似于此的异步http客户机替换此异步http客户机

我们正在使用异步http客户机(通过Play框架),但仍然会遇到异常。但我们使用nginx作为反向代理来终止SSL。我认为这个问题仍然有足够的负荷,现在解决了吗?在SpringWebFlux(5.1.7)的最新版本的重载之后,我得到了HuuugeStackTrace的相同异常。我不认为这是固定的。我一直在SpringWebFlux 5.3.4上看到这个问题。你解决了吗?这是我的答案,我使用了其他客户端