HttpCore用于测量http请求/响应经过的时间

时间:2013-08-26 21:56:22

标签: java web-services http rest asynchronous

我有一个基于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。

2 个答案:

答案 0 :(得分:0)

在阻塞i / o模式下,请求执行(或处理)在收到消息头(请求行+标题)后立即终止。消息正文(如果可用)与内容实体关联为InputStream实例。这使消费者能够直接从底层网络套接字流式传输内容。因此,您所需要的只是确保响应内容实体被完全消耗。

    long start = System.nanoTime();
    HttpResponse httpResponse = httpexecutor.execute(request, conn, context);
    EntityUtils.consume(httpResponse.getEntity());
    long elapsed = System.nanoTime() - start;

答案 1 :(得分:0)

  

所以这段代码不够优雅。我想获取响应对象,以便为我提供http流量的已用时间。我怎么能这样做?

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

  • 如果您只需要一次这个时间测量,请保持代码不变。它看起来不太好,但这是回调在Java中的常见方式。
  • 如果您不止一次需要它,您可以创建一个帮助方法来发送请求并为您进行时间测量。这样你可以把它放在一个地方。