如何使用 Jetty 客户端根据请求获取 bytesIn/bytesOut

Posted

技术标签:

【中文标题】如何使用 Jetty 客户端根据请求获取 bytesIn/bytesOut【英文标题】:How to get the bytesIn/bytesOut on a request basis using Jetty Client 【发布时间】:2021-06-10 21:06:04 【问题描述】:

我正在使用 Jetty Client 11,并希望为每个请求计算发送/接收的字节数。

我正在使用高级 HttpClient 。 我已阅读此文档,但没有看到有关如何执行此操作的任何信息:

https://www.eclipse.org/jetty/documentation/jetty-11/programming-guide/index.html

我看到有一种方法可以通过以下方式获取此信息:

        ConnectionStatistics connectionStatistics = new ConnectionStatistics();
        httpClient.addBean(connectionStatistics);

然后:

        Request request = httpClient.newRequest(uri)
                .version(HttpVersion.HTTP_2)
                .timeout(CONNECTION_TIMEOUT_SECONDS, TimeUnit.SECONDS);
        request.send(listener);
        ConnectionStatistics connectionStatistics = httpClient.getBean(ConnectionStatistics.class);
        System.out.println(connectionStatistics.getSentBytes()+"/"+ connectionStatistics.getReceivedBytes());

而且我一定做错了什么,因为它甚至不能在全球范围内工作,它总是给出 0。

无论如何,我不知道如何根据请求使其工作。

编辑:

我试过@sbordet 答案:

httpClient.newRequest(...)
  .onRequestContent((req, buf) -> requestBytes.add(buf.remaining()))
  ...
  .onResponseContent((res, buf) -> responseBytes.add(buf.remaining()))
  ...
  send(...);

它可以很好地响应。 BUT 对于请求,我想测量发送的字节,它总是给出 0(注意我只有没有内容的获取)而我希望有原始大小(原始 HTTP 请求字节,包括标头大小...)

【问题讨论】:

【参考方案1】:

您可以使用Request.ContentListener 计算请求字节数,使用Response.ContentListener 计算响应字节数:

httpClient.newRequest(...)
  .onRequestContent((req, buf) -> requestBytes.add(buf.remaining()))
  ...
  .onResponseContent((res, buf) -> responseBytes.add(buf.remaining()))
  ...
  send(...);

【讨论】:

谢谢,如果回复是gzip的,是解压前还是解压后? 它适用于响应,但对于请求,我想测量发送的字节数,它总是给出 0(注意我只有没有内容的获取)而我希望有原始大小 你好@sbordet,我用我的评论更新了我的问题,如果你能看看就好了。谢谢

以上是关于如何使用 Jetty 客户端根据请求获取 bytesIn/bytesOut的主要内容,如果未能解决你的问题,请参考以下文章

Jetty如何检测HTTP连接是不是被客户端关闭

如何根据 cpu/内存使用情况或挂起的请求返回 503 服务器繁忙?

如何将 Spring WebClient 与 Jetty 一起使用,而不是 Netty?

tomcat与jetty接收请求参数的区别

使用 Jetty 9 从 HttpClient 获取响应时出错

如何配置嵌入式 Jetty 以处理 OPTIONS 预检请求?