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);

例如,我得到以下经过时间:经过时间 --> 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 beta。

4

2 回答 2

0

所以这段代码并不优雅。我想得到响应对象来给我 http 流量的经过时间。我怎样才能做到这一点?

响应是从收到您的请求的服务器发送的。因此,服务器可以向您发送的唯一时间是处理请求所需的时间。但是你也对网络流量感兴趣,所以这种方法无论如何都不适合你。

  • 如果您只需要此时间测量一次,请保持代码不变。它看起来不太好,但这是 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 回答