关于 httpclient4.3.5 ssl handShake时卡住的问题

最近碰到一个问题,百度没有发现问题的解决办法,记录下来,提醒自己,也希望其他人碰到相同问题也可以查看到。

问题原因:httpclient4.3.5 在某种情况下产生的由防火墙导致的超时bug

有一个定时任务来触发一个singleThreadPool执行任务,但是发现这个任务会在执行一半就卡住,下一个时段相同的定时任务也不再执行。排查log发现,系统执行至一个httpclient调用的地方就不会再打出后续的log。初步判断是httpclient.excute()阻塞了线程,导致singleThreadPool的线程被占用,后续的定时任务只能等待。

“Thread-14” - Thread t@128
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:152)
at java.net.SocketInputStream.read(SocketInputStream.java:122)
at sun.security.ssl.InputRecord.readFully(InputRecord.java:442)
at sun.security.ssl.InputRecord.read(InputRecord.java:480)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:934)
- locked <5f4de726> (a java.lang.Object)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1332)
- locked <7382a0ab> (a java.lang.Object)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1359)

多次查看dump发现线程确实卡在httpclient.excute()更深层的ssl的starthandshake()处,一度怀疑是服务器证书问题导致,不过百度没有得到有用的信息,有一篇文章的讲解应该是切中了原理,分析了请求卡在read()方法上。后来通过stackoverflow发现了相同的问题,httpclient4.3.5的bug,导致在此处阻塞。4.3.6已修复。

解决方法:升级到httpclient4.3.6即可

附上stackoverflow关于此问题的回答,github的更新和httpclient关于此条的wiki

https://stackoverflow.com/questions/28785085/how-to-prevent-hangs-on-socketinputstream-socketread0-in-java

https://github.com/apache/httpcomponents-client/commit/d954cd287dfcdad8f153e61181e20d253175ca8c

https://issues.apache.org/jira/browse/HTTPCLIENT-1589

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值