1

サービスを呼び出す小さな Java Apache HttpCore 4 ベースのクライアント クラスがあり、http 要求/応答の往復の応答時間を測定したいと考えていました。HttpResponse オブジェクトのメタデータから読み取る方法があると思いました。しかし、応答オブジェクトで応答時間を取得できませんでした。だから、私の解決策は、電話をかける前に時間を保存し、電話をかけた後に時間を測定し、その差が経過時間です。

      BasicHttpRequest request = new BasicHttpRequest("GET", target);
      request.setParams(params);
      httpexecutor.preProcess(request, httpproc, context);

      long start = System.nanoTime();
      HttpResponse httpResponse = httpexecutor.execute(request, conn, context);
      long elapsed = System.nanoTime() - start;
      System.out.println("Elapsed nano seconds -->" + elapsed);

      httpResponse.setParams(params);
      httpexecutor.postProcess(httpResponse, httpproc, context);

たとえば、次の経過時間を取得します: Elapsed time -->1561599815

そして、応答オブジェクトから次の値を持つ次のヘッダーを読み取ることができましたが、応答時間に関連するものは何も見つかりませんでした:

|   Server --> Apache-Coyote/1.1   |
|   Date --> Mon, 26 Aug 2013 19:22:00 GMT   |
|   Content-Type --> application/json   |
|   Transfer-Encoding --> chunked   |

上記の解決策は、匿名の内部関数 FutureCallback によってコールバック関数呼び出しを行わなければならなかった非同期ノンブロッキング コードでは特に醜いです。このような:

requester.execute(new BasicAsyncRequestProducer(target, request),
          new BasicAsyncResponseConsumer(), pool,
          new BasicHttpContext(),
        // Handle HTTP response from a callback
                new FutureCallback<HttpResponse>() {
                                        private int startTime; ...//etc

したがって、このコードはエレガントではありません。http トラフィックの経過時間を取得するために、応答オブジェクトを取得したいと考えていました。どうやってやるの?

httpClient 4.2、httpCore-nio 4.2、httpasyncclient 4.0 ベータ版を使用しています。

4

2 に答える 2

0

したがって、このコードはエレガントではありません。http トラフィックの経過時間を取得するために、応答オブジェクトを取得したいと考えていました。どうやってやるの?

リクエストを受信したサーバーからレスポンスが送信されます。したがって、サーバーあなたに送信できるのは、リクエストの処理に必要な時間だけです。ただし、ネットワーク トラフィックにも関心があるため、この方法は適していません。

  • この時間測定が 1 回だけ必要な場合は、コードをそのままにしておいてください。見栄えはよくありませんが、これは Java でコールバックがどのように見えるかという通常の方法です。
  • 複数回必要な場合は、リクエストを送信して時間測定を行うヘルパー メソッドを作成できます。このように一か所に留めておくことができます。
于 2013-11-27T06:28:42.310 に答える
0

ブロッキング I/O モードでは、リクエストの実行 (または処理) は、メッセージ ヘッド (リクエスト行 + ヘッダー) を受信した直後に終了します。InputStreamメッセージ本文は、利用可能な場合、コンテンツ エンティティにインスタンスとして関連付けられます。これにより、コンシューマは基盤となるネットワーク ソケットからコンテンツを直接ストリーミングできます。したがって、必要なのは、応答コンテンツ エンティティが完全に消費されていることを確認することだけです。

    long start = System.nanoTime();
    HttpResponse httpResponse = httpexecutor.execute(request, conn, context);
    EntityUtils.consume(httpResponse.getEntity());
    long elapsed = System.nanoTime() - start;
于 2013-08-27T13:02:56.357 に答える