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