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上看到这个问题。你解决了吗?这是我的答案,我使用了其他客户端