如何获取使用 Jetty Client 连接所需的时间

How to get the time it took to connect using Jetty Client

我正在使用 Jetty Client 11 并想计算建立连接所需的时间。

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

我猜这个信息在 Connection#onOpen 中,但我不知道如何插入我的代码

ClientConnector connector = new ClientConnector();
connector.setConnectTimeout(Duration.ofSeconds(1));
connector.setIdleTimeout(Duration.ofSeconds(1));
ClientConnectionFactory.Info http1 = HttpClientConnectionFactory.HTTP11;

HTTP2Client http2Client = new HTTP2Client(connector);
ClientConnectionFactoryOverHTTP2.HTTP2 http2 = new 
          ClientConnectionFactoryOverHTTP2.HTTP2(http2Client);
HttpClientTransportDynamic transport = new HttpClientTransportDynamic(connector, http2, http1);

HttpClient httpclient = new HttpClient(transport);

QueuedThreadPool threadPool = new QueuedThreadPool(3);
threadPool.setName("test");
httpClient.setExecutor(threadPool);
httpClient.start();

这取决于你所说的“建立连接”是什么意思。

如果您的意思只是建立 TCP 连接,您可能需要 wrap/subclass SocketAddressResolver 和 wrap/override resolve(host, port, promise).

调用resolve()时可以轻松保存开始时间,并记录promise完成时的停止时间。

或者,您可以将 Connection.Listener 作为 bean 添加到 HttpClient:

HttpClient httpclient = new HttpClient(transport);
httpClient.addBean(new Connection.Listener() {
  @Override
  public void onOpened(Connection connection) { 
    ... 
  }
});

如果你的意思是 TCP 连接建立 + TLS 握手,你可以使用一个 SslHandshakeListener 来知道 TLS 握手何时完成,并将其添加为一个 bean:

HttpClient httpclient = new HttpClient(transport);
httpClient.addBean(new SslHandshakeListener() {
  @Override
  public void handshakeSucceeded(Event event) {
    ...
  }
});

另请查看 org.eclipse.jetty.io.ConnectionStatisticsIncludeExcludeConnectionStatistics 实用程序 类,它记录了有关连接的大量统计信息。