2017-07-26 94 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