有什么区别吗? ctx.close
只是ctx.channel.close
的缩短版本吗?
答案 0 :(得分:26)
我们假设我们在管道中有三个处理程序,它们都拦截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()
。答案 1 :(得分:23)
ctx.close()从ChannelHandlerContext开始流经ChannelPipeline,而ctx.channel()。close()将始终从ChannelPipeline的尾部开始。