2014-01-20 1 views

Antwort

22

Nehmen wir an, wir haben drei Handler in der Pipeline, und alle fangen den close()-Vorgang ab und rufen ctx.close() darin auf.

ChannelPipeline p = ...; 
p.addLast("A", new SomeHandler()); 
p.addLast("B", new SomeHandler()); 
p.addLast("C", new SomeHandler()); 
... 

public class SomeHandler extends ChannelOutboundHandlerAdapter { 
    @Override 
    public void close(ChannelHandlerContext ctx, ChannelPromise promise) { 
     ctx.close(promise); 
    } 
} 
  • Channel.close() triggert C.close(), B.close(), A.close(), und dann um den Kanal zu schließen.
  • ChannelPipeline.context("C").close() wird B.close(), A.close() auslösen und dann den Kanal schließen.
  • ChannelPipeline.context("B").close() wird A.close() auslösen, und schließen Sie dann den Kanal.
  • ChannelPipeline.context("A").close() wird den Kanal schließen. Es werden keine Handler angerufen.

Also, wenn Sie Channel.close() und ChannelHandlerContext.close() verwenden sollten? Die Faustregel:

  • Wenn Sie ein ChannelHandler und wollen in der Nähe des Kanals in der Prozedur zu schreiben, rufen ctx.close().
  • Wenn Sie den Kanal von außerhalb des Handler schließen (zB haben Sie einen Hintergrund-Thread, die nicht ein I/O-Thread ist, und Sie möchten die Verbindung von diesem Thread schließen.)
+0

Im Allgemeinen ctx .channel.close sollte verwendet werden? Können Sie Beispiele geben, in denen ctx.close verwendet werden sollte? –

+1

Im Allgemeinen können Sie ctx.close() verwenden, wenn Sie wissen, dass der "spätere" ChannelHandler in der ChannelPipeline das Close-Event nicht interessiert. –

+0

Antwort aktualisiert. – trustin

17

ctx.close() beginnt von der Stelle des ChannelHandlerContext aus über die ChannelPipeline zu fließen, während ctx.channel(). Close() immer vom Ende der ChannelPipeline aus startet.

Verwandte Themen