簡體   English   中英

使用 Apache HttpComponents HttpClient 測量帶寬使用情況

[英]Measure bandwidth usage with Apache HttpComponents HttpClient

如何測量我的應用程序的 HttpClients 帶寬使用情況? (HttpComponents 4.3)

我有一個使用 HttpClient 與服務器通信的客戶端應用程序。 所有請求都是使用池化 http 連接管理器通過同一個客戶端完成的。 不幸的是,大多數請求直接使用 httpclient(不是全部),因此在請求位置測量帶寬是可行的,但很痛苦。

在客戶端的構造函數或連接管理器中是否有一個地方可以簡單地注入我自己的帶寬監視器(或者它是否已經內置在我沒有發現的地方)?

我可以用這個做嗎?

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

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

        }
    }).build();

自定義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();
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 包含您需要的一切。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM