2012-02-11 10 views
1

Tomcatが提供するJava/JSP Webアプリケーションを使用して、Webサービスを呼び出してパートナーWebサービスからデータを取得します。パートナーサービスで使用される技術は不明です。パートナーのWebサービスが、それはしてSocketTimeoutExceptionを返し頻繁に長時間の停電があります。パートナーのWebサービスが簡単に停止している場合複数の依存java.net.SocketTimeoutExceptionsからTomcat Java Serverアプリケーションが復旧しない

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サービスに1時間以上の長時間の停止があり、タイムアウトしたサービスへの呼び出しが数百件あった場合、アプリケーションは回復しない状態になります。パートナーサービスが戻ってきますが、そのサービスへのアプリケーション呼び出しでも、まったく同じSocketTimeoutExceptionエラーが発生します。

その時点でTomcatを起動して停止すると、すべて正常に動作します。

私はhttpキープアライブを使用していません。私のコードは、例外が発生するかどうかにかかわらず、すべてのオブジェクトインスタンスをクリーンアップすることについての肛門です。これ以上使用することができるがあるまでは、離れエラーで1を投げ、いくつかのリソース(ソケット?)「まで使用して」されたTomcatのJavaプロセスのように思えるん。誰もこれを以前見たことがありますか?解決策は明らかですか?私はこの問題について多くの調査をしており、同じ問題を抱えている人は見つけられませんでした。

ありがとうございます! John

+0

システムがこの揺れた状態になると、スタックダンプまたはヒープダンプを実行しましたか?これらは潜在的に様々な資源枯渇問題を指摘する可能性がある。さらに、tomcatをバウンスする前に、開いているソケットをコンピュータにリストする必要があります。 – jtahlborn

+0

netstat -anoは実際にTIME_WAIT状態になっているTCPソケットの多くを示しています。これらのほとんどのPIDは0で、これはシステムアイドルプロセスです。どういう意味ですか? – Squidious

答えて

0

TCP_WAIT状態にあった接続のTCP/IPスタックのスロットが不足していた状況がありました。オペレーティングシステムに厳しい制限があります。限界を知る方法は、Windowsサーバ上で実行している場合は、sysinternalsのツールのいくつかを使用することができるnetstatのようなツールを使用することです。

あなたの問題を解決するには、サーキットブレーカーと呼ばれるデザインパターンは、本の中で説明されるかもしれないです何が起こるのか、回路ブレーカパターンとhttp://pragprog.com/book/mnee/release-it

と呼ばれている回路ブレーカを介したリモートのWebサービスフローへのあなたの呼び出しリモートサービスへの呼び出しが多すぎるとブレーカが開かれます。ブレーカがオープン状態になると、リモートサービスへのコールはブレーカコードですぐに失敗します。通常、ブレーカを再試行して再度開いてください。とにかく、本は私がちょうどあなたに与えた簡単なものより良い説明を持っています。

https://bitbucket.org/asaikali/circuitbreaker/には、CircuitBreakerパターンのオープンソースのサンプル実装があります。

+0

netstat -anoは実際にTIME_WAIT状態になっているTCPソケットの多くを示しています。これらのほとんどのPIDは0で、これはシステムアイドルプロセスです。どういう意味ですか? – Squidious

+0

ここで私はいくつかの良い情報(および提案)を見つけました:http://wiki.apache.org/HttpComponents/FrequentlyAskedConnectionManagementQuestions 私が実装したコード変更は 'urlConn.setRequestProperty( "Connection"、 "close"); 次回の停止後、コード変更が実際の修正かどうかをここで報告します。 – Squidious

+0

この修正プログラムは本番環境に投入されて以来、大規模な停止が1回しかありませんでしたが、1時間の停止後にサーバーがうまく回復しました。修正はよく見えます。 – Squidious

関連する問題