首页  编辑  

RestTemplate请求HTTPS链接只有第一次正确访问

Tags: /Java/   Date Created:
环境: JDK 11.0.1版本,SpringBoot 2.7.7
测试发现以下代码中,总是第一次能够正确获取到第三方API的返回结果(结果比较大,超过1MB),后续就不正常了,访问API总是提示 HTTP Status 503 错误。
private static restTemplate = new RestTemplate();

restTemplate.exchange("https://www.abc.com/api/...", HttpMethod.GET, entity, String.class);
经过实验,发现该问题仅在使用 JDK 11.0.1 版本时出现问题,更换 JDK 11.0.19或者Jbr 17等其他版本时均没有问题。
最开始怀疑是RestTemplate的Cookie管理导致(resttemplate调用接口第一次成功,以后都失败)的,但调测发现并不是这个问题导致,调测和抓包可以看到无论哪中情况,发送出去request内容均是一样的。后使用TCPView监控发现,对于JDK 11.0.1版本,每次请求之后,SSL 的链接没有正常关闭,如下图:
甚至有些连接的send和recv字节数都不对,正常应该都是一样的包数。更换成 JDK 11.0.19后,TCPView显示每次请求后,连接能正常关闭。
由此怀疑是JDK本身的缺陷导致的,查找资料发现问题: apache httpclient 4.x - Spring RestTemplate with JDK11 errors Posting data above certain limit - Stack Overflow,官方BUG工单: [JDK-8216326] SSLSocket stream close() does not close the associated socket - Java Bug System (openjdk.org)

解决方法:更换JDK版本。