2017-08-25 2 views
1

J'écris un serveur proxy HTTP dans Netty.Comment faire pour que 'channelRead' soit appelé une fois après chaque 'read' dans Netty

Je voudrais channelRead seulement être tiré au plus une fois après que j'appelle read - et à aucun autre moment. En d'autres termes, je ne veux pas channelRead de tirer jusqu'à ce que je suis prêt pour le message.

J'ai défini AUTO_READ=false. J'appelle ctx.read() une fois dans channelActive (et nulle part ailleurs).

Cependant, pour une curl http://localhost:8080/, les deux incendies gestionnaire channelRead de base:

io.netty.handler.codec.http.DefaultHttpRequest 
io.netty.handler.codec.http.LastHttpContent$1 

Comment puis-je empêcher LastHttpContent d'arriver jusqu'à ce que j'appelle ctx.read() pour la deuxième fois?

+0

j'ai trouvé la solution: 'FlowControlHandler': « Le 'FlowControlHandler' assure que seul un message par' lire () 'est envoyé en aval." ... va vérifier après le dîner: D –

Répondre

2

FlowControlHandler résout ce problème: il a été conçu spécifiquement pour activer ce comportement.

De the docs:

Le FlowControlHandler assure que seul un message par read() est envoyé en aval .

...

C'est un problème commun avec le HttpObjectDecoder qui va très souvent un feu HttpRequest qui est immédiatement suivi d'un événement LastHttpContent.

ChannelPipeline pipeline = ...;

pipeline.addLast(new HttpServerCodec());

pipeline.addLast(new FlowControlHandler());

pipeline.addLast(new MyExampleHandler());

+0

L'exemple à l'intérieur du javadoc de ce cl le cul semble être coupé à mi-chemin, avez-vous un exemple comment l'utiliser? (spécifiquement, ido vous devez toujours appeler 'setAutoRead' quand vous utilisez ce gestionnaire?) – Ferrybig

+0

Dans mon cas, j'ai' AUTO_READ = false', mais cela signifie seulement "ne pas lire automatiquement à partir du socket", donc si un encodeur produit plusieurs messages pour un morceau de données reçues (comme le 'HttpDecoder'), alors vous aurez encore 2 messages ou plus qui arrivent à votre gestionnaire. Le 'FlowControlHandler' aide dans ces cas. Notez également que la plupart des décodeurs effectuent automatiquement une lecture même si vous avez 'AUTO_READ = false' car ils ont besoin de lire suffisamment de données pour donner au moins un message aux gestionnaires suivants (c'est-à-dire vos) ... mais après un message, ils ne seront pas lus automatiquement à partir du socket à nouveau. –