【问题标题】:Measure bandwidth usage with Apache HttpComponents HttpClient使用 Apache HttpComponents HttpClient 测量带宽使用情况
【发布时间】:2014-11-27 18:36:40
【问题描述】:

如何衡量我的应用的 HttpClients 带宽使用情况? (HttpComponents 4.3)

我有一个使用 HttpClient 与服务器通信的客户端应用程序。所有请求都通过同一个客户端使用池化 http 连接管理器完成。不幸的是,大多数请求直接使用 httpclient(不是全部),因此在请求位置测量带宽是可行的,但很痛苦。

在客户端的构造函数或连接管理器中是否有一个地方可以简单地注入我自己的带宽监视器(或者它已经内置在我没有发现的某个地方)?

我可以这样做吗?

    HttpClientBuilder.create().addInterceptorLast(new HttpResponseInterceptor()
    {

        @Override
        public void process(HttpResponse response, HttpContext context) throws HttpException, IOException
        {

        }
    }).build();

【问题讨论】:

  • 您想要测量的究竟是什么?传输的总字节数?每个连接传输的总字节数?每个请求的字节数?每秒?
  • 整个客户端的每秒总字节数(将发出多个请求/连接/等)。

标签: java apache-httpcomponents


【解决方案1】:
HttpClient client = HttpClients.createDefault();
HttpGet req = new HttpGet("https://www.google.com/");
HttpClientContext hcc = HttpClientContext.create();
HttpResponse res = client.execute(req, hcc);
HttpConnectionMetrics metrics = hcc.getConnection().getMetrics();
EntityUtils.consumeQuietly(res.getEntity());
LOG.debug("sent: {}, recv: {}, reqcnt: {}, rescnt: {}",
        metrics.getSentBytesCount(), metrics.getReceivedBytesCount(),
        metrics.getRequestCount(), metrics.getResponseCount());

HttpConnectionMetrics 包含您需要的一切。

【讨论】:

    【解决方案2】:

    自定义HttpRequestExecutor应该是最方便的拦截点

    这是一个非常粗略的解决方案,但我希望足以让您入门。

    final AtomicLong totalBytes = new AtomicLong();
    
    HttpRequestExecutor requestExecutor = new HttpRequestExecutor() {
    
        @Override
        protected HttpResponse doSendRequest(
                final HttpRequest request,
                final HttpClientConnection conn,
                final HttpContext context) throws IOException, HttpException {
            HttpResponse response = super.doSendRequest(request, conn, context);
            HttpConnectionMetrics metrics = conn.getMetrics();
            totalBytes.addAndGet(metrics.getSentBytesCount());
            metrics.reset();
            return response;
        }
    
        @Override
        protected HttpResponse doReceiveResponse(
                final HttpRequest request,
                final HttpClientConnection conn,
                final HttpContext context) throws HttpException, IOException {
            HttpResponse response = super.doReceiveResponse(request, conn, context);
            HttpConnectionMetrics metrics = conn.getMetrics();
            totalBytes.addAndGet(metrics.getReceivedBytesCount());
            metrics.reset();
            return response;
        }
    };
    
    CloseableHttpClient httpclient = HttpClients
            .custom()
            .setRequestExecutor(requestExecutor)
            .build();
    

    【讨论】:

      猜你喜欢
      • 2013-02-19
      • 1970-01-01
      • 2012-03-30
      • 2011-08-26
      • 1970-01-01
      • 1970-01-01
      • 2014-11-09
      • 2011-09-26
      • 1970-01-01
      相关资源
      最近更新 更多