時々、ログに次のスタックトレースが表示されます。HttpClient
ソケットは、別のサーバーからtext/script
コンテンツにアクセスしようとしてタイムアウトします。私の質問は、Linux上でWeblogic上で実行されているJ2EEアプリについて、どの構成設定をチェックする必要があるかということです。私は特に以下を探しています。
HttpClient
paramsこれが私のコードです
HTTPResponse httpClientResponse;
//do some stuff
httpClientResponse.getStatusCode(); // this is where it fails
これがスタックトレースです
Java.net.SocketTimeoutException: Read timed out
at jrockit.net.SocketNativeIO.readBytesPinned(Native Method)
at jrockit.net.SocketNativeIO.socketRead(SocketNativeIO.Java:32)
at Java.net.SocketInputStream.socketRead0(SocketInputStream.Java)
at Java.net.SocketInputStream.read(SocketInputStream.Java:129)
at HTTPClient.BufferedInputStream.fillBuff(BufferedInputStream.Java:206)
at HTTPClient.BufferedInputStream.read(BufferedInputStream.Java:126)
at HTTPClient.StreamDemultiplexor.read(StreamDemultiplexor.Java:356)
at HTTPClient.RespInputStream.read(RespInputStream.Java:147)
at HTTPClient.RespInputStream.read(RespInputStream.Java:108)
at HTTPClient.Response.readResponseHeaders(Response.Java:1123)
at HTTPClient.Response.getHeaders(Response.Java:846)
at HTTPClient.Response.getStatusCode(Response.Java:331)
at HTTPClient.RetryModule.responsePhase1Handler(RetryModule.Java:92)
at HTTPClient.HTTPResponse.handleResponseImpl(HTTPResponse.Java:872)
at HTTPClient.HTTPResponse.access$000(HTTPResponse.Java:62)
at HTTPClient.HTTPResponse$2.run(HTTPResponse.Java:839)
at HTTPClient.HTTPResponse$2.run(HTTPResponse.Java:837)
at
HTTPClient.HttpClientConfiguration.doAction(HttpClientConfiguration.Java:666)
at HTTPClient.HTTPResponse.handleResponse(HTTPResponse.Java:837)
at HTTPClient.HTTPResponse.getStatusCode(HTTPResponse.Java:242)
ありがとう
私は以下の所見で質問を更新します。
HttpClient
には明示的なタイムアウトが設定されていません。つまり、サーバーのhttpセッションタイムアウトが有効になっている可能性があります。SO_TIMEOUT
for HttpClient
は0です。これは、無期限に待機することを意味します。トラック1
Javadocsによると、HttpclientにはSocketタイムアウトのデフォルト値がないようです。アップデートの質問に答えるために、ここではセッションタイムアウトは有効になりません。 Weblogicのデフォルトは、セッションタイムアウトの30分です。
サーバー session timeout
は、ユーザーがサーバーにアクセスしていない場合にHttpSession
がメモリに保持される時間を表します。
socket timeoutは、呼び出し元にデータが転送されている間、サーバーソケットを開いたままにする時間です。これは、サーバーがまだデータを処理して書き戻している場合でも、かなり時間がかかり、クライアントはそれを待ってタイムアウトになりました。
一部のリンクはこのデフォルトが60秒であることを示唆していますが、javadocsは何も言わず、どの場合でもこの値を120秒などに設定して、それが役立つかどうかを確認できます
必要なのは、タイムアウトの時間を計ることです-それが明らかな場合。意味-これらのエラーは、発信要求の30秒、60秒、または5分後に表示されますか?
SO_Timeoutを変更して再試行します
トラック2-OSパラメーター
NDD値に推奨されるBEAパラメータがあります。これは、着信接続を開いたままにしておく時間や、キューに入れる接続の数などを管理します。 Solarisでは、これらを実行することで取得できます
/usr/sbin/ndd -get /dev/tcp tcp_time_wait_interval
/usr/sbin/ndd -get /dev/tcp tcp_conn_req_max_q
/usr/sbin/ndd -get /dev/tcp tcp_conn_req_max_q0
/usr/sbin/ndd -get /dev/tcp tcp_ip_abort_interval
/usr/sbin/ndd -get /dev/tcp tcp_keepalive_interval
Linuxでの同等のコマンドおよび設定する値については、Oracleのドキュメントを確認してください。 Solarisでの私の経験では、デフォルトでは十分ではなく、BEA(Oracle)の推奨事項に合わせる必要があります。
トラック3:Weblogic /外部アクセスログ
サーバーでHTTPアクセスログを有効にしましたか?これらの失敗した要求は、応答バイトサイズで表示されますか、または応答サイズ0で表示されますか?どのエラーコードまたはHTTPステータスコードが返されますか?
それとも、これらのタイムアウトしたものがアクセスログにまったく記録されていないのでしょうか?
ここでは、タイムアウトが発生する外部サーバーもWeblogicであると想定しています。そうでない場合、この質問は同等のプラットフォームの外部サーバーチームに向けられています。
**その他**
通常、スレッドダンプは役立ちますが、タイムアウトの問題が発生しているサーバーでスレッドダンプを取得する必要があります。あなたはクライアントであり、接続を正常に取得した後、応答を読み取るときにタイムアウトになります。外部サーバーは過負荷ですか?スレッドの不足? CPUが高い?同時リクエストが多すぎますか?
ここで説明されていないもう1つの側面は、ファイアウォールです。
SocketTimeoutExceptionsは、多くの場合、通信用に開いていないポート、または選択したマシンからの通信のみをブロックするファイアウォールに関連していることがあります。
問題をデバッグする場合は、通信しようとしている2台のマシン間にファイアウォールがあるかどうかも確認し、ファイアウォールがある場合は、2台間の通信にポートが使用可能であることを確認してください。
ファイアウォール関連の問題に関する興味深い点は、サーバーがダウンしているか応答していないかを通知しないことです。典型的な動作は、クライアントを永久に待機させることです。だから、あなたはいつも暗闇の中に残されています。サーバーポート上の単純なtelnetが、通信に使用可能/開いているかどうかを示す必要があります。
お役に立てれば。
調査する必要があります
(a)デフォルトまたは明示的なHttpClient
読み取りタイムアウトのいずれか使用中。
(b)サーバーがその期間内に応答しない理由、想定される場合(サーバーログを表示する)、
(c)それ以外の場合、タイムアウトの設定が短すぎる理由。多くのタイムアウトの設定が短すぎます。数秒。それらは1分の数分であり、予想される応答時間が長い場合は、予想される応答時間の2倍または3倍になります。