当前位置: 首页 > 知识库问答 >
问题:

Spring WebClient抛出javax . net . SSL . SSL exception:SSLEngine在大量使用时已经关闭

燕砚文
2023-03-14

这是我的代码:

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分钟内(对同一个URL)调用它500~600次时,它会抛出

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

编辑

我尝试只创建一个Web客户端实例,但它仍然会引发相同的异常

共有3个答案

晁璞
2023-03-14

我也遇到过同样的问题,就像OP提到的那样,它发生在负载下,但也很容易在服务器负载下由“nginx-s重新加载”触发。我在nginx论坛上发布了这篇文章,但至今没有回复https://forum.nginx.org/read.php?2,281786.在我的例子中,我使用一个单一客户端实例来处理多个请求,所以我认为Brian的评论不适用。

邹俊豪
2023-03-14

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

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

您可以尝试:

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

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

方琦
2023-03-14

我发现这是由于这个问题造成的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

 类似资料:
  • 我在服务器上托管了一个spring应用程序(Tomcat 8.5)。如果没有人使用它,它就会闲置。我已经知道,如果数据库处于空闲状态8小时(MySQL的默认超时),就会发生超时。正如在Spring Autoreconnect and Connection lost过夜帖子中提到的,我已经尝试了这里提供的解决方案。我尝试过配置应用程序。但这并不能解决问题。 (PS:除了Spring应用程序中的app

  • 我使用的是Apache httpclient 4.3.6和httpcore 4.3.3(与opensaml 3.3.0捆绑)。我试图通过HTTPS通过代理获取网页,但每次都会收到SocketTimeoutException。HTTP连接工作正常。具体的超时并不重要;它只是需要更长的时间才能以更高的值失败。 示例代码: 尝试连接到代理时引发异常。堆栈跟踪是 这看起来很像Apache问题HTTPCLI

  • 我有一个奇怪的例子,我有一个secret.env文件,我把所有的环境变量都设置成这样: 秘密. env 然后我构建了一个docker文件来导出所有变量并运行应用程序: 但是,这将引发一个关键错误: 当我在我的窗户上运行这个程序时,它工作得很好! 有人能帮我一下吗?

  • 我使用NestJS,TypeORM和MySQL来构建一个Web应用程序。 我正在使用文件,用于传入一些环境变量以连接到本地数据库。同步设置为。 app.module.ts 此外,我还有一个用户模块,用于导入用户实体。 用户。单元ts 你ser.entity.ts 假设我的数据库是空的,当第一次启动应用程序时,TypeORM同步将自动为我创建具有适当列和数据类型的用户表。但是,在关闭应用程序并尝试重

  • 我必须使用WebClient进行分页API调用,并最终组合所有结果。例如:个人最新1000交易详情。在一次调用中,我将在json响应(List)中获得最大100个对象。这个人最多只能得到1000条记录。 在伪代码java中,它可能看起来像这样 如何在SpringMVC中以反应式方式编写相同的内容而不阻塞? 像这样的东西???我不知道。帮助我

  • 方法在什么条件下抛出?官方文件提到: NullPointerException-如果指定的集合包含null元素并且该集合不允许null元素,或者如果指定的集合为null 我如何确保这个“集合不允许空元素” 输出