【发布时间】:2014-02-10 00:50:11
【问题描述】:
有什么不同吗? ctx.close 只是 ctx.channel.close 的较短版本吗?
【问题讨论】:
标签: netty
有什么不同吗? ctx.close 只是 ctx.channel.close 的较短版本吗?
【问题讨论】:
标签: netty
假设我们在管道中有三个处理程序,它们都拦截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()。【讨论】:
@Override 并且项目符号对我来说没有意义。 @trustin 我错过了什么吗?谢谢
ChannelOutboundHandlerAdapter。
ctx.close()从ChannelHandlerContext的点开始流过ChannelPipeline,而ctx.channel().close()一直从ChannelPipeline的尾部开始。
【讨论】: