2010-06-08 85 views
3

在我的一个应用程序中,我们使用HttpURLConnection命中另一个服务器 - 该应用程序在几个月内工作良好,现在突然所有命中都面临连接超时。间歇地,几个呼叫(500中的1个)成功,而所有其他呼叫失败。该应用程序部署在使用Tomcat 5.5的Java 5上运行的Linux上。我试过curlwget从命令行工作正常。Java中的HttpURLConnection中的荒诞连接超时

使用完全相同的代码库的另一个Java进程能够从命令行进行连接。我们已经重新启动了tomcat服务器以及机器,但无济于事。我们已经彻底检查了机器,并且没有任何拦截进程/防火墙阻碍(显然其他Java进程能够建立连接)。

在间歇性爆发(例如每天一次)中,应用程序能够建立几个连接,然后返回到中断状态。堆栈跟踪中也没有多少明显的迹象。

任何可能出错的建议?

如果服务器DNS在应用程序运行时发生更改,Java将不会选择此项,并且连接将从旧IP(考虑IP关闭)超时。因此,在CDN的情况下,如果一个节点出现故障并被替换为另一个IP,则可能会出现问题。

+0

您连接到自己的服务的服务?一些服务(特别是主要的RSS服务)将故意阻止频繁访问它们的用户。 – Quotidian 2010-06-08 16:34:18

+0

是的,我打的服务是我们自己的,并且没有这样的负载规则:( – sangupta 2010-06-08 17:04:31

回答

5

我有同样的问题,这是由HttpURLConnection处理keepalive造成的。问题就走了,当我们禁用保活通过设置此系统属性,

http.keepAlive=false 

我们有防火墙相关的另一个问题。如果目标URL被防火墙阻止,则需要很长时间(超过2分钟)。我们必须在另一个线程中运行我们的所有HttpURLConnection,以便在几秒钟后中断它。

+0

将Keepalive设置为错误原因*更多*要建立的连接更多更多。怎么可能解决连接超时? – EJP 2010-06-09 00:00:05

+0

由于keepalive的方式是通过HttpURLConnection来处理的,它可以让连接处于一个简单挂起的状态。如果你关心keepalive,可以使用带有多线程连接管理器的HttpClient。 – 2010-06-09 00:44:48