【问题标题】:Recycling Jetty Http2 Client streams -- best practice?回收 Jetty Http2 客户端流——最佳实践?
【发布时间】:2018-01-01 11:42:45
【问题描述】:

我们有一个 Jetty Http2 客户端,大致如 here 示例所示。

客户端处理的每个请求都会调用session.newStream(...)。似乎旧流不是 GC-ed。但是,我们似乎无法在 API 中找到回收它们或关闭它们的好方法。

我们是否应该使用streamPromise.get().setIdleTimeout(t) 设置一个非常小的空闲超时?

我们是否应该保留 Stream 对象,在交换完成时标记它,然后重用它?不过在这种情况下,我们还需要回收监听器,这使得它是有状态的。

有没有办法“关闭”一个 Stream 对象,或者将其标记为 GC?简单地将其设置为 null 似乎不太像 API。

【问题讨论】:

    标签: jetty client http2


    【解决方案1】:

    关闭的流被GCed。

    Streams 支持半关闭,因此为了关闭流,您需要发送带有 end_stream 标志集的帧,并接收带有 end_stream 标志集的帧。

    如果您直接使用HTTP2Client,很可能您并没有在您身边结束流(即您发送帧,但忘记在您发送的最后一帧上设置end_stream 标志),或者服务器不会结束流(这将是一个服务器错误)。

    无论哪种情况,在客户端上为类别org.eclipse.jetty.http2 启用调试日志记录将告诉您帧是否设置了end_stream 标志,并在删除流时报告 - 您只需要解析可能较大的日志文件。

    【讨论】:

    • 我们所有的请求都是end_stream,它们的构造是这样的:HeadersFrame headersFrame = new HeadersFrame(request, null, true);。此外,我们的业务逻辑以@Override public void onData(Stream stream, DataFrame frame, Callback dataCallback) {if (frame.isEndStream()) { ... 结尾。那个时候 Stream 被认为是关闭的吗?
    • 您必须完成数据回调。如果您在上面显示的 onData() 在客户端上,那么是的,流已关闭,并且在调用 onData() 之前已被删除。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    • 2021-03-15
    • 2012-02-25
    • 2020-08-15
    • 1970-01-01
    相关资源
    最近更新 更多