Преимущество ChannelInitializer над обработчиком каналов в Netty


Каковы преимущества использования ChannelInitializer по сравнению с цепочкой ChannelHandlers напрямую?

Например, с загрузкой сервера я мог бы сделать:

bootstrap.childHandler(channel_handler);

Добавьте в реализацию channel_handler я бы реализовал следующее

class simple_channel_handler implements ChannelHandler
{
    public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
        // TODO Auto-generated method stub
        System.out.println("handler added");
        ctx.pipeline().addLast(new simple_channel_handler_2());
    }
}

Где, как и в случае ChannelInitializer

        ch.pipeline().addLast(
                               new channel_handler_1(), 
                               new channel_handler_2()
                             );

И в каждом из обработчиков я мог бы сделать

class channel_handler_1 extends ChannelInboundHandlerAdapter
{

    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        // TODO Auto-generated method stub
        System.out.println("Channel just became active");
        ctx.fireChannelRead(ctx); // Fire directly to channel handler 2
    }
}

Таким образом, единственное преимущество заключается в том, что обработчик канала не должен понимать, где он запускает канал, считываемый в ? Я не вижу никакого другого преимущества использования инициализатора канала

1 3

1 ответ:

Согласно документации (см. здесь http://netty.io/wiki/user-guide-for-4.x.html )

Указанный здесь обработчик всегда будет вычисляться заново принятый канал. ChannelInitializer-это специальный обработчик, который предназначена для того, чтобы помочь пользователю настроить новый канал. Это наиболее вероятно что вы хотите настроить ChannelPipeline Нового канала с помощью добавление некоторых обработчиков, таких как DiscardServerHandler для реализации вашего сетевое приложение. Как то приложение усложняется, вполне вероятно что вы добавите больше обработчиков в конвейер и извлекете это анонимный класс в конечном счете превращается в класс высшего уровня.

Таким образом, ChannelInitializer-это простой способ добавить обработчики по мере необходимости, особенно если у вас их несколько.

Это не мешает иметь один обработчик, добавляющий больше обработчиков (как это было в вашем первом примере), Например для динамического добавления / изменения одного обработчика в конвейере в соответствии с контекстом, но для" статических "или" стандартных " обработчиков использование ChannelInitializer является более чистым способом, поскольку он действительно близок к определению bootstrap и поэтому более удобочитаем.