在我的一个应用程序中,我们使用HttpURLConnection命中了另一台服务器-该应用程序运行了好几个月,现在突然所有命中都面临连接超时.间歇性地,几个呼叫(500个中的1个)成功,而其他所有呼叫都失败.该应用程序部署在运行Java 5.5和Tomcat 5.5的Linux上.我从命令行尝试了curl和wget,效果很好.
使用完全相同的代码库的另一个Java进程能够从命令行建立连接.我们已经重新启动了tomcat服务器以及机器,但无济于事.我们已经彻底检查了机器,没有阻塞进程/防火墙对此造成阻碍(显然其他Java进程也可以建立连接).
在间歇性突发(例如每天一次)中,应用程序能够建立一些连接,然后返回到断开状态.从堆栈跟踪中也看不出太多.
有什么建议可能会出错吗?
[更新]如果在应用程序运行时服务器DNS发生更改,则Java将不会启动此连接,并且连接将从较旧的IP超时(考虑到IP已关闭).因此,在CDN的情况下,如果某个节点发生故障并被另一个IP替换,则可能会出现问题.
解决方法:
我有同样的问题,这是由HttpURLConnection对keepalive的处理引起的.当我们通过设置此系统属性来禁用keepalive时,问题就消失了,
http.keepAlive=false
我们还有另一个与防火墙有关的问题.如果目标URL被防火墙阻止,则超时时间较长(超过2分钟).我们必须在另一个线程中运行所有HttpURLConnection,以便在几秒钟后可以中断它.