サービスを呼び出す小さな 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 ベータ版を使用しています。