使用Java AsyncHttpClient调用服务时遇'SslHandler removed before handshake completed'错误
问题分析与解决方案
异常原因
你遇到的SslHandler removed before handshake completed异常,核心原因是连接超时设置过短:你把setConnectTimeout(100)设为100毫秒,而SSL握手需要完成证书验证、密钥交换等步骤,这个过程所需时间远超过100ms,导致握手还没完成就被客户端强制断开,进而触发该异常。
另外你的代码存在冗余问题:重复创建了AsyncHttpClient实例(两次调用Dsl.asyncHttpClient(clientBuilder)),这会浪费资源,也可能引发不必要的连接问题。
修复步骤
1. 调大连接超时时间
将连接超时调整到合理范围,比如3000ms(3秒),给SSL握手足够的完成时间:
DefaultAsyncHttpClientConfig.Builder clientBuilder = Dsl.config() .setConnectTimeout(3000) // 调整为3000ms,可根据实际网络情况调整 .setKeepAlive(true) .setSslContext(sslContext);
2. 复用AsyncHttpClient实例
不要重复创建客户端实例,创建一次后复用:
// 仅创建一次客户端实例 AsyncHttpClient client = Dsl.asyncHttpClient(clientBuilder); // 后续请求复用该客户端 BoundRequestBuilder postRequest = client.preparePost(BASE_URL) .addHeader("Content-Type", "application/json") .addHeader("x-api-key", transactionKey) .addHeader("Cache-Control", "no-cache") .setBody(reqObj); ListenableFuture<Response> responseFuture = postRequest.execute();
3. 验证SSL上下文配置
确保你的sslContext配置正确:
- 如果目标服务使用自签名证书,需将证书添加到信任管理器中
- 检查SSL上下文的密钥库/信任库配置是否正确,避免因证书验证失败间接导致握手超时
内容的提问来源于stack exchange,提问作者Krishna gaddipati
相关产品推荐
相关产品推荐

