有区别吗?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()。