2012-02-11 45 views
1

我有一個Java/JSP的Web應用程序提供了被Tomcat,使Web服務調用了一個合作伙伴網絡服務來獲取數據。合作伙伴服務中使用的技術是未知的。該合作伙伴網絡服務具有經常停電延長它返回一個SocketTimeoutException:的Tomcat Java服務器應用程序不恢復從多個從屬java.net.SocketTimeoutExceptions

java.net.SocketTimeoutException: connect timed out 
    at java.net.PlainSocketImpl.socketConnect(Native Method) 
    at java.net.PlainSocketImpl.doConnect(Unknown Source) 
    at java.net.PlainSocketImpl.connectToAddress(Unknown Source) 
    at java.net.PlainSocketImpl.connect(Unknown Source) 
    at java.net.Socket.connect(Unknown Source) 
    at sun.net.NetworkClient.doConnect(Unknown Source) 
    at sun.net.www.http.HttpClient.openServer(Unknown Source) 
    at sun.net.www.http.HttpClient.openServer(Unknown Source) 
    at sun.net.www.protocol.https.HttpsClient.<init>(Unknown Source) 
    at sun.net.www.protocol.https.HttpsClient.New(Unknown Source) 
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(Unknown Source) 
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source) 
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source) 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source) 
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source) 

如果合作伙伴的Web服務有一個短暫的中斷,然後迅速地恢復,我的應用程序很好地處理一切。

如果合作伙伴網絡服務的延期中斷時間超過一個小時,並且我的應用程序有數百個服務調用已經超時,那麼在某些時候我的應用程序會達到不能恢復的狀態。合作伙伴服務回來,但我的應用程序調用該服務仍導致相同的確切SocketTimeoutException錯誤。

如果我開始在這一點停止Tomcat,然後一切工作正常後。

我不使用保持HTTP連接。我的代碼是關於清理所有對象實例的分析,無論是否發生異常。看起來Tomcat的Java過程似乎「用盡了」一些資源(套接字?),拋棄了每個錯誤,直到沒有更多可用的東西。有沒有人見過這個,並有解決方案明顯?我在這件事上做了很多搜索,沒有發現任何人有同樣的問題。

在此先感謝! 約翰

+0

當你的系統進入該楔形狀態,你做了一個堆棧轉儲或堆轉儲?這些可能會指向各種資源耗盡問題。此外,您應該在反彈tomcat之前列出計算機上的開放套接字。 – jtahlborn 2012-02-11 20:43:02

+0

netstat -ano確實在TIME_WAIT狀態中顯示了很多TCP套接字。大多數PID的PID是0,這是系統空閒過程。那是什麼意思? – Squidious 2012-02-14 18:58:33

回答

0

我曾經遇到過一種情況,那就是TCP/IP堆棧中的插槽用於處於TCP_WAIT狀態的連接,在操作系統中存在一些硬限制,您可以應對這些限制。找出限制的方法是使用像netstat這樣的工具,如果你在Windows服務器上運行,你可以使用sysinternals的一些工具。

你的問題的解決方案可以被稱爲巡迴制動器設計模式,其在書中解釋稱爲http://pragprog.com/book/mnee/release-it

與斷路器格局發生的事情是,你要通過斷路器的遠程web服務流程調用當斷路器處於打開狀態時,如果太多的遠程服務呼叫失敗,這將打開斷路器。斷路器處於打開狀態時,斷路器代碼中的電話將立即失效,通常情況下,您可以編程斷路器重試,看看是否會再次打開。無論如何,這本書比我剛剛給你的簡短的一本書有更好的解釋。

https://bitbucket.org/asaikali/circuitbreaker/具有斷路器圖案的開放源碼樣本實現。

+0

netstat -ano確實在TIME_WAIT狀態中顯示了很多TCP套接字。大多數PID的PID是0,這是系統空閒過程。那是什麼意思? – Squidious 2012-02-14 18:58:24

+0

我在這裏發現了一些很好的信息(和建議):http://wiki.apache.org/HttpComponents/FrequentlyAskedConnectionManagementQuestions 我實現的代碼更改是'urlConn.setRequestProperty(「Connection」,「close」);' 接下來的停運後,我將在這裏報到的代碼更改是否實際修復。 – Squidious 2012-02-14 20:00:26

+0

由於此修復程序已投入生產,我們只有一次重大停機,但在停機1小時後,我們的服務器恢復良好。修復看起來不錯。 – Squidious 2012-03-11 21:35:36

相關問題