2017-07-26 9 views
0

私たちは、例としてhereのように構築されたJetty Http2クライアントを持っています。リサイクル桟橋Http2クライアントストリーム - ベストプラクティス?

クライアントによって処理された各要求はsession.newStream(...)となります。古いストリームはGC化されていないようです。しかし、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(ストリームストリーム、DataFrameフレーム、コールバックdataCallback){if(frame.isEndStream()){...'。その時、ストリームは閉じられていると見なされますか? – Deroude

+0

データコールバックを完了する必要があります。上記の 'onData()'がクライアント上にある場合、 'onData()'を呼び出す直前にストリームが閉じられ、すでに削除されています。 – sbordet