3

私のアプリケーションの 1 つで、HttpURLConnection を使用して別のサーバーにヒットしました。アプリケーションは数か月間問題なく動作していましたが、突然すべてのヒットが接続タイムアウトに直面しています。断続的に、いくつかの呼び出し (500 回に 1 回) が成功し、他の呼び出しはすべて失敗します。アプリケーションは、Tomcat 5.5 を使用して Java 5 で実行されている Linux にデプロイされます。コマンドラインからcurlwgetを試してみましたが、うまくいきました。

まったく同じコード ベースを使用する別の Java プロセスは、コマンド ラインから接続できます。Tomcat サーバーとマシンを再起動しましたが、役に立ちませんでした。マシンを徹底的にチェックしましたが、これを妨げるブロック プロセス/ファイアウォールはありません (他の Java プロセスが接続できることは明らかです)。

断続的なバースト (1 日 1 回など) では、アプリケーションはいくつかの接続を確立でき、その後、壊れた状態に戻ります。スタック トレースからも明らかなことはあまりありません。

うまくいかない可能性のある提案はありますか?

[更新] アプリケーションの実行中にサーバーの DNS が変更された場合、Java はこれを検出せず、古い IP からの接続がタイムアウトになります (IP がダウンしていると見なされます)。したがって、CDN の場合、ノードがダウンして別の IP に置き換えられると、問題が発生する可能性があります。

4

1 に答える 1

5

同じ問題が発生しましたが、これはHttpURLConnectionによるキープアライブの処理が原因でした。このシステムプロパティを設定してキープアライブを無効にすると、問題は解決しました。

http.keepAlive=false

ファイアウォールに関連する別の問題があります。宛先URLがファイアウォールによってブロックされている場合、タイムアウトに長い時間がかかります(2分以上)。すべてのHttpURLConnectionを別のスレッドで実行して、数秒後に中断できるようにする必要があります。

于 2010-06-08T17:23:34.343 に答える