在Netty 4中,CTX.Close和CTX.Channel.Close之间有什么区别



有区别吗?ctx.close只是ctx.channel.close的较短版本吗?

假设我们有三个操作员,他们都拦截了close()操作,并在其中调用ctx.close()

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()将触发C.close()B.close()A.close(),然后关闭频道。
  • ChannelPipeline.context("C").close()将触发B.close()A.close(),然后关闭频道。
  • ChannelPipeline.context("B").close()将触发A.close(),然后关闭频道。
  • ChannelPipeline.context("A").close()将关闭通道。不会称任何处理程序。

那么,当您使用Channel.close()ChannelHandlerContext.close()时?经验法则是:

  • 如果您正在编写ChannelHandler并想关闭处理程序中的频道,请致电ctx.close()
  • 如果您从处理程序外部关闭通道(例如,您有一个不是I/O线程的背景线程,并且您想从该线程关闭连接。)

ctx.close()从频道handlercontext的点开始流过通道置线,而ctx.channel()。close()。close()。

最新更新