In Netty 4, what's the difference between ctx.close and ctx.channel.close?

Ngoc Dao picture Ngoc Dao · Jan 20, 2014 · Viewed 10k times · Source

Is there any difference? Is ctx.close just a shorter version of ctx.channel.close?

Answer

trustin picture trustin · Jan 21, 2014

Let's say we have three handlers in the pipeline, and they all intercept the close() operation, and calls ctx.close() in it.

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() will trigger C.close(), B.close(), A.close(), and then close the channel.
  • ChannelPipeline.context("C").close() will trigger B.close(), A.close(), and then close the channel.
  • ChannelPipeline.context("B").close() will trigger A.close(), and then close the channel.
  • ChannelPipeline.context("A").close() will close the channel. No handlers will be called.

So, when you should use Channel.close() and ChannelHandlerContext.close()? The rule of thumb is:

  • If you are writing a ChannelHandler and wanna close the channel in the handler, call ctx.close().
  • If you are closing the channel from outside the handler (e.g. you have a background thread which is not an I/O thread, and you want to close the connection from that thread.)