我有一个基于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。
答案 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流量的已用时间。我怎么能这样做?
响应从收到您请求的服务器发送。因此,服务器可以发送给您的唯一时间是处理请求所需的时间。但是你也对网络流量感兴趣,所以这种方法无论如何都不适合你。