Apache HTTPClient5.1部署Linux出现IllegalStateException异常问题咨询
Apache HttpClient 5.1 报错
java.lang.IllegalStateException: Current state = RESET, new state = FLUSHED 解决方案 根因定位
- 该错误是Apache HttpClient 5.1及更低版本的已知线程安全缺陷:
BasicScheme类内部会复用非线程安全的CharsetEncoder实例,多线程并发调用生成认证头时,不同线程同时修改编码器状态,就会触发状态校验异常 - Windows和Linux表现不一致是因为两个系统的JVM线程调度策略存在差异,Linux下线程并发竞争更激烈,更容易触发编码器状态冲突的问题
- 你当前的代码每次请求新建
CloseableHttpClient实例的逻辑没有问题,问题出在HttpClient默认的认证方案缓存机制会跨请求复用BasicScheme实例,并发场景下就会触发冲突
修复方案
方案1(推荐):升级Apache HttpClient版本
官方在5.2版本已经修复了该缺陷,修复逻辑为每次生成认证响应时都创建独立的CharsetEncoder实例,不再全局复用,直接将依赖版本升级到5.2或更高版本即可解决。
方案2(无需升级版本):禁用认证缓存
如果当前项目不方便升级版本,可在构造HttpClient时添加禁用认证缓存的配置,避免BasicScheme实例被跨请求复用:
final HttpClientBuilder httpclientBuilder = HttpClients.custom() // 新增这一行配置 .disableAuthCaching();
方案3(临时兜底):每次请求清空上下文认证缓存
如果上述方案都无法落地,可在每次执行请求前手动清空HttpClientContext中的认证方案缓存:
final HttpClientContext clientContext = HttpClientContext.create(); clientContext.resetAuthCache(); // 再执行请求 try (final CloseableHttpResponse response = httpClient.execute(httpPost, clientContext)){ // 原有业务逻辑 }
验证建议
- 测试环境模拟生产Linux端的并发请求场景,调整Tomcat线程池配置和生产保持一致,先复现问题再应用修复方案验证
- 排查项目中是否有全局复用
HttpClientContext的逻辑,如有需要改为每次请求创建独立实例
内容的提问来源于stack exchange,提问作者David Dahan
相关产品推荐
相关产品推荐

