2

HTTP リクエストが送信されない、またはリクエストに対する HTTP レスポンスが散発的に得られないという奇妙な状況に陥っています。私のアプリケーションは、定期的に他のサードパーティ サービスに対して数回 (100 秒) の http 要求を行いますが、そのほとんどはまったく問題なく動作します。カスタム HttpRequestIntercerptor および HttpResponseInterceptor で CloseableHttpAsyncClient (バージョン 4.0) を使用します。これらは主にデバッグ目的で追加されたもので、RequestInterceptor はチェーンの最後のインターセプターであり、ResponseInterceptor は最初のインターセプターです。アイデアは、実際のリクエストを送信する前の最後の段階で各 http リクエストをログに記録し、最初に受信したときに各 http レスポンスをログに記録することでした。

非同期クライアントをセットアップするには、次のパターンがあります。

    HttpAsyncClientBuilder asyncClientBuilder = HttpAsyncClientBuilder.create();
    asyncClientBuilder.addInterceptorLast(new MyHttpRequestInterceptor());
    asyncClientBuilder.addInterceptorFirst(new MyHttpResponseInterceptor());
    IOReactorConfig reactorConfig = IOReactorConfig.DEFAULT;

    reactorConfig.setConnectTimeout(5 * 60 * 1000); // 5 mins 
    reactorConfig.setSoTimeout(5 * 60 * 1000); // 5 mins
    asyncClientBuilder.setDefaultIOReactorConfig(reactorConfig);
    System.setProperty("http.maxConnections", "100");

    this.asyncHttpClient = asyncClientBuilder.useSystemProperties().build();
    this.asyncHttpClient.start();

リクエストを行うには、次のようにします。

HttpGet httpGet = new HttpGet("some url");
asyncHttpClient.execute(httpGet, new AsyncHTTPResponseHandler(requestMetadata));

これが私の AsyncHTTPResponseHandler クラスです:

class AsyncHTTPResponseHandler implements FutureCallback<HttpResponse> {

    // local copy of the request for reference while processing the response.
    private RequestMetadata requestMetadata;

    public AsyncHTTPResponseHandler(final RequestMetadata requestMetadata) {
        this.setRequestMetadata(requestMetadata);
        Thread.currentThread().setUncaughtExceptionHandler(new HttpUncaughtExceptionHandler(requestMetadata));
    }

    @Override
    public void cancelled() {
        logger.error("AsyncHTTPResponseHandler#Http request id: {} cancelled",
                requestMetadata.getRequestId()));
    }

    @Override
    public void completed(HttpResponse response) {
        logger.debug("Received HTTP Response for request id: {}",
                requestMetadata.getRequestId());
        //handleHttpResponse(requestMetadata, response);
    }

    @Override
    public void failed(Exception e) {
        logger.error("AsyncHTTPResponseHandler#Error in Http request id: " + requestMetadata.getRequestId(), e);
    }

}

このセットアップに基づいて、インターセプター ログに基づいて次のケースを確認します。2. アプリケーションの http リクエストが asyncclient HttpRequest をトリガーし (インターセプターがログに記録)、このリクエストの HttpResponse を取得できません --- 理由がわかりませんか? 3. アプリケーションの http 要求が asyncclient HttpRequest をトリガーせず (インターセプターはそれをログに記録しません)、この要求の HttpResponse を取得しません --- 理由がわかりませんか?

これを修正したり、この問題をさらにデバッグしたりできることに関するヒントや提案はありますか?

ありがとう!!

4

1 に答える 1