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