Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Netty 4中,什么';ctx.close和ctx.channel.close的区别是什么?_Netty - Fatal编程技术网

在Netty 4中,什么';ctx.close和ctx.channel.close的区别是什么?

在Netty 4中,什么';ctx.close和ctx.channel.close的区别是什么?,netty,Netty,有什么区别吗?是否ctx.close只是ctx.channel.close的一个较短版本?ctx.close()从ChannelHandlerContext的点开始流经ChannelPipeline,而ctx.channel().close()将始终从ChannelPipeline的尾部开始。假设我们有三个处理程序在管道中,它们都拦截close()操作,并在其中调用ctx.close() ChannelPipeline p = ...; p.addLast("A", new SomeHandle

有什么区别吗?是否
ctx.close
只是
ctx.channel.close
的一个较短版本?

ctx.close()从ChannelHandlerContext的点开始流经ChannelPipeline,而ctx.channel().close()将始终从ChannelPipeline的尾部开始。

假设我们有三个处理程序在管道中,它们都拦截
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.channel.close?你能举例说明应该在哪里使用ctx.close吗?通常,当你知道ChannelPipeline中的“稍后”ChannelHandler不关心close事件时,你可以使用ctx.close()。没有close()方法,因此我们无法
@Override
,而且这些要点对我来说没有意义@相信我,我错过了什么吗?Thanks@Aaron谢谢你的报道。它应该是
ChannelOutboundHandlerAdapter