JDK17/Wildfly26.1.3升级后Connection reset问题求助
问题分析与解决方案
核心诱因定位
从现象判断,问题仅触发于JDK15及以上版本,与Wildfly版本关联度极低(JDK15搭配Wildfly16也会出现),说明根源是JDK15+的安全/网络默认行为变更,而非Wildfly配置或Apache HttpClient版本本身。
针对性排查与修复步骤
强制指定兼容的TLS加密套件
JDK15起默认启用了TLS_AES_256_GCM_SHA384等新加密套件,部分老旧服务端可能不支持这类套件,导致SSL会话建立后,后续数据传输因加密协商不兼容触发连接重置。可手动指定服务端兼容的加密集合,覆盖JDK默认:SSLContext sslContext = SSLContexts.custom() .loadTrustMaterial(null, (chain, authType) -> true) // 测试用,生产需替换为可信证书校验逻辑 .build(); SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory( sslContext, new String[]{"TLSv1.2", "TLSv1.3"}, new String[]{"TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384", "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"}, // 替换为服务端支持的套件 SSLConnectionSocketFactory.getDefaultHostnameVerifier()); CloseableHttpClient httpClient = HttpClients.custom() .setSSLSocketFactory(sslSocketFactory) .build();禁用HTTP/2自动升级
JDK16开始,底层网络实现默认启用HTTP/2协议,部分服务端未正确支持该协议,会导致连接建立后请求发送时被重置。可强制Apache HttpClient使用HTTP/1.1:RequestConfig requestConfig = RequestConfig.custom() .setHttp11ForceUpgrade(false) // 禁用HTTP/2升级逻辑 .setSocketTimeout(5000) .setConnectTimeout(5000) .build(); CloseableHttpClient httpClient = HttpClients.custom() .setDefaultRequestConfig(requestConfig) .build();调整连接池与Keep-Alive参数
JDK15+对TCP连接的空闲超时、存活检测逻辑做了调整,可能导致Keep-Alive连接被提前回收。可显式配置Apache HttpClient连接池参数,匹配服务端的Keep-Alive策略:PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(); connManager.setMaxTotal(200); connManager.setDefaultMaxPerRoute(20); connManager.setDefaultSocketConfig(SocketConfig.custom() .setSoKeepAlive(true) .setSoTimeout(10000) // 与服务端Keep-Alive超时对齐 .build()); CloseableHttpClient httpClient = HttpClients.custom() .setConnectionManager(connManager) .build();排查Elytron子系统SSL配置冲突
Wildfly26的Elytron子系统默认SSL配置可能与应用内的Apache HttpClient配置冲突,比如加密套件、信任库不一致。可在standalone.xml中调整Elytron的ssl-context,与应用配置对齐:<ssl-context name="application-ssl-context" trust-manager="app-trust-manager"> <protocols> <protocol name="TLSv1.2"/> <protocol name="TLSv1.3"/> </protocols> <cipher-suite-filter>TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256</cipher-suite-filter> </ssl-context>
验证建议
- 回退到JDK11确认问题消失,排除服务端本身故障;
- 逐步应用上述修复项,每一步验证连接状态;
- 开启Apache HttpClient DEBUG日志,查看SSL握手细节、TCP状态变化,定位具体失败环节:
log4j.logger.org.apache.http=DEBUG log4j.logger.org.apache.http.wire=DEBUG
内容的提问来源于stack exchange,提问作者Rony Nguyen
相关产品推荐
相关产品推荐

