Преимущество 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 ответ:
Согласно документации (см. здесь http://netty.io/wiki/user-guide-for-4.x.html )
Указанный здесь обработчик всегда будет вычисляться заново принятый канал. ChannelInitializer-это специальный обработчик, который предназначена для того, чтобы помочь пользователю настроить новый канал. Это наиболее вероятно что вы хотите настроить ChannelPipeline Нового канала с помощью добавление некоторых обработчиков, таких как DiscardServerHandler для реализации вашего сетевое приложение. Как то приложение усложняется, вполне вероятно что вы добавите больше обработчиков в конвейер и извлекете это анонимный класс в конечном счете превращается в класс высшего уровня.
Таким образом, ChannelInitializer-это простой способ добавить обработчики по мере необходимости, особенно если у вас их несколько.
Это не мешает иметь один обработчик, добавляющий больше обработчиков (как это было в вашем первом примере), Например для динамического добавления / изменения одного обработчика в конвейере в соответствии с контекстом, но для" статических "или" стандартных " обработчиков использование ChannelInitializer является более чистым способом, поскольку он действительно близок к определению bootstrap и поэтому более удобочитаем.