В 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.

Другие вопросы по тегам