2017-07-26 2 views
0

Nous avons un client Http2 Jetty construit à peu près comme l'exemple here.Recyclage Jetée Http2 Flux de clients - bonne pratique?

Chaque demande traitée par le client appelle session.newStream(...). Il semble que les anciens flux ne sont pas édités par GC. Cependant, nous ne pouvons pas trouver un bon moyen, dans l'API, de les recycler ou de les fermer.

Faut-il définir un très petit délai d'inactivité en utilisant streamPromise.get().setIdleTimeout(t)?

Devrions-nous conserver l'objet Stream, le marquer quand un échange se termine, puis le réutiliser? Dans ce cas, nous devons également recycler l'écouteur, ce qui rend l'état.

Existe-t-il un moyen de "fermer" un objet Stream ou de le marquer pour GC? Le simple fait de le mettre à null ne semble pas très API-ish.

Répondre

0

Les flux qui sont fermés sont GCed.

Stream moitié de soutien ferme, de sorte que pour un flux à vous fermé devez envoyer un cadre avec le drapeau end_stream, et recevoir un cadre avec le drapeau end_stream. Si vous utilisez HTTP2Client directement, il est probable que vous ne terminiez pas le flux de votre côté (vous envoyez des images, mais vous oubliez de définir le drapeau end_stream sur la dernière image que vous envoyez) ou le serveur ne se termine pas le flux (ce qui serait un bug de serveur).

les deux cas, activation de la journalisation DEBUG pour la catégorie org.eclipse.jetty.http2 sur le client vous dira si les cadres ont le drapeau end_stream, et de faire rapport lorsque les flux sont supprimés - il vous suffit d'analyser les fichiers journaux peut-être grand-ish.

+0

Toutes nos requêtes sont 'end_stream', elles sont construites comme ceci:' HeadersFrame headersFrame = new HeadersFrame (request, null, true); '. En outre, notre logique métier se termine par '@Override public void onData (flux de données, trame DataFrame, Callback dataCallback) {if (frame.isEndStream()) {...'. Le Stream est-il considéré comme fermé à ce moment-là? – Deroude

+0

Vous devez * compléter * le rappel de données. Si le 'onData()' que vous montrez ci-dessus est sur le client, alors oui le flux est fermé et il a déjà été supprimé juste avant d'appeler 'onData()'. – sbordet