2017-07-26 96 views
0

我们有一个大致如示例here构建的Jetty Http2客户端。回收Jetty Http2客户端流 - 最佳实践?

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

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

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

有没有办法“关闭”Stream对象,或者将它标记为GC?简单地将它设置为null似乎不是API-ISH。

回答

0

关闭的流 GCed。

Stream的支持下半关闭,所以为了使流被关闭,你需要发送与end_stream标志设置的框架,并接收与end_stream标志设置的框架。

如果你直接使用HTTP2Client,有机会,你不就在你身边结束流(即发送帧,但忘了设置end_stream标志你发送的最后一帧),或服务器没有结束流(这将是一个服务器错误)。

两种情况下,在客户端上开启调试日志记录org.eclipse.jetty.http2类别会告诉你的帧是否有end_stream标志设置,当流会被删除报告 - 你只需要解析可能大十岁上下的日志文件。

+0

我们所有的请求都是'end_stream',它们是这样构造的:'HeadersFrame headersFrame = new HeadersFrame(request,null,true);'。另外,我们的业务逻辑以'@Override public void onData(Stream stream,DataFrame frame,Callback dataCallback){if(frame.isEndStream()){...')结束。该流在当时是否被认为是封闭的? – Deroude

+0

您*必须*完成数据回调。如果上面显示的'onData()'在客户端上,那么流是关闭的,在调用'onData()'之前它已经被移除。 – sbordet