ch.write () проходит через весь конвейер - PullRequest
1 голос
/ 01 февраля 2012

У меня есть два SimpleChannelHandler в моей заявке:

pipeline.addLast("handler1", new FirstHandler());
pipeline.addLast("handler1", new SecondHandler());

Оба реализуют messageReceived и writeRequested.FirstHandler выполняет некоторые действия по рукопожатию и будет удален после того, как это будет сделано, так что только SecondHandler останется в канале.

Если я напишу что-то на канале с ch.write(...) на этапе установления связизатем он проходит через весь канал (от последнего к первому обработчику).Почему даже writeRequested из SecondHandler называется?Я ожидал, что он просто возвращается со слоя, где мы делаем ch.write (...):

         |                   ^
         v                   |
    FirstHandler ---->  FirstHandler

    // Not used in the handshaking step
    SecondHandler ---->  SecondHandler

Почему ch.write(...) проходит через все слои?

1 Ответ

1 голос
/ 01 февраля 2012

Это связано с тем, что существует множество способов записи из обработчика, от channel.write () до непосредственного использования класса org.jboss.netty.channel.Channels. Вы использовали channel.write (), который фактически делегирует сначала. В вашем случае вы должны напрямую использовать второй метод из каналов.

  1. Запись в последний нисходящий обработчик в конвейере

    public static ChannelFuture write(Channel channel, Object message)..

  2. Запись в ближайший нисходящий обработчик

    public static void write(ChannelHandlerContext ctx, ChannelFuture future, Object message)..

...