我们的Jetty Http2客户端大致构建为示例here。
客户端处理的每个请求都会调用session.newStream(...)
。似乎旧流不是GC编辑的。但是,我们似乎无法在API中找到回收它们或关闭它们的好方法。
我们应该使用streamPromise.get().setIdleTimeout(t)
设置一个非常小的空闲超时吗?
我们应该保留Stream对象,在交换完成后标记它,然后重用它吗?但在这种情况下,我们还需要回收监听器,这使得状态良好。
有没有办法“关闭”Stream对象,或将其标记为GC?简单地将其设置为null似乎不是API-ish。
答案 0 :(得分:0)
关闭的流 GCed。
Stream
支持半关闭,因此为了关闭流,您需要发送一个设置了end_stream
标志的帧,并接收一个带有end_stream
标志的帧集。
如果你直接使用HTTP2Client
,很可能你没有结束你身边的流(即你发送帧,但忘记在最后一帧设置end_stream
标志发送),或服务器不结束流(这将是一个服务器错误)。
无论是哪种情况,在客户端上启用类别org.eclipse.jetty.http2
的DEBUG日志记录都会告诉您框架是否设置了end_stream
标志,并报告何时删除流 - 您只需要解析可能的大型日志文件。