Есть ли разница? Является ли ctx.close более короткой версией ctx.channel.close?
В Netty 4, какая разница между ctx.close и ctx.channel.close?
Ответ 1
Скажем, у нас есть три обработчика в конвейере, и все они перехватывают операцию 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(). - Если вы закрываете канал снаружи обработчика (например, у вас есть фоновый поток, который не является потоком ввода-вывода, и вы хотите закрыть соединение с этим потоком.)
Ответ 2
ctx.close() начинает протекать через ChannelPipeline с точки ChannelHandlerContext, а ctx.channel(). close() будет начинаться с хвоста ChannelPipeline все время.