2010-06-08 86 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