使用Apache HttpComponents HttpClient测量带宽使用情况

Cog*_*man 2 java apache-httpcomponents

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

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

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

我可以这样做吗?

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

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

        }
    }).build();
Run Code Online (Sandbox Code Playgroud)

ok2*_*k2c 5

自定义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();
Run Code Online (Sandbox Code Playgroud)