1. ホーム
  2. java

[解決済み] Apache HttpClient Interim Error: NoHttpResponseException

2022-02-02 04:57:44

質問

XMLを使ったPOSTメソッドを受け付けるウェブサービスがあります。これは正常に動作しているが、あるランダムな機会にサーバーとの通信に失敗し、IOExceptionをメッセージとともに投げる。 The target server failed to respond . その後の呼び出しは正常に行われます。

この現象は、いくつかの呼び出しを行った後、10~15分ほどアプリケーションをアイドル状態にしておくと発生します。

いくつか試してみたのですが.

リトライハンドラーを次のように設定しました。

HttpRequestRetryHandler retryHandler = new HttpRequestRetryHandler() {

            public boolean retryRequest(IOException e, int retryCount, HttpContext httpCtx) {
                if (retryCount >= 3){
                    Logger.warn(CALLER, "Maximum tries reached, exception would be thrown to outer block");
                    return false;
                }
                if (e instanceof org.apache.http.NoHttpResponseException){
                    Logger.warn(CALLER, "No response from server on "+retryCount+" call");
                    return true;
                }
                return false;
            }
        };

        httpPost.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, retryHandler);

が、この再試行が呼ばれることはなかった。(そう、私は正しいinstanceof節を使っているのです)。デバッグ中、このクラスは一度も呼び出されませんでした。

を設定してみたりもしました。 HttpProtocolParams.setUseExpectContinue(httpClient.getParams(), false); が、使えません。どなたか、今できることを教えてください。

重要なこと なぜ例外が発生するのかを理解することに加えて、私が持っている重要な懸念の1つは、なぜここでretryhandlerが動作しないのか、ということです。

解決方法は?

ほとんどの場合、コネクションマネージャーによって維持されている持続的な接続は、古くなってしまいます。つまり、接続がアイドル状態のときに、HttpClientがそのイベントに反応することなく、ターゲットサーバ側で接続をシャットダウンしてしまい、接続が半分閉じられた状態、または「stale」になってしまうのです。通常、これは問題ではありません。HttpClientは、プールからのリース時に接続の有効性を確認するために、いくつかの技術を採用しています。古い接続のチェックが無効になっているときに古い接続を使用してリクエストメッセージを送信すると、 通常は SocketException が発生して書き込みに失敗し、自動的に再試行されます。しかし、状況によっては書き込み操作が例外を発生させずに終了し、その後の読み込み操作で -1 (end of stream) が返されることがある。この場合、HttpClientは、リクエストは成功したが、サーバー側で予期せぬエラーが発生したため、サーバーが応答できなかったと判断するほかはありません。

この状況を改善する最も簡単な方法は、有効期限切れの接続や、1分以上アイドル状態が続いた接続を、一定時間経過後にプールから追い出すことです。詳しくは、以下を参照してください。 HttpClientチュートリアルのこのセクションを参照してください。 .