Удаление обработчика из пайплайна

Я пытаюсь удалить определенный обработчик из моего конвейера обработчиков, но у меня возникают проблемы с этим. Когда я перечисляю обработчики в конвейере до и после, обработчик, который я пытался удалить, все еще там. Так что я делаю неправильно здесь? Вот фрагмент кода. Все это находится в стадии запуска. Как видите, последнее, что я делаю, — это настраиваю фабрику конвейеров. Я использую Netty 3.6.1.final.

    List<String> handlers = new ArrayList<String>();

    // list handlers in the pipeline
    try {
        handlers = this.pipelineFactory.getPipeline().getNames();
        for (int len = handlers.size(), i = 0; i < len; i++) {
          String s = handlers.get(i);
          System.out.println("Item " + i + " is " + s);
        }

    } catch( Exception e ) {}

    try {
        System.out.println("Remove hexdump");
        this.pipelineFactory.getPipeline().remove("hexdump");
    } catch( Exception e ) {
       System.out.println("error = " + e.getMessage());
    }


    try {
        handlers = this.pipelineFactory.getPipeline().getNames();
        for (int len = handlers.size(), i = 0; i < len; i++) {
          String s = handlers.get(i);
          System.out.println("Item " + i + " is " + s);
        }

    } catch( Exception e ) {}

    // Configure the pipeline factory.
    this.bootstrap.setPipelineFactory(this.pipelineFactory);

Вот результат:

Item 0 is framer
Item 1 is hexdump
Item 2 is handler
Remove hexdump
Item 0 is framer
Item 1 is hexdump    
Item 2 is handler

person MLightheart    schedule 31.01.2013    source источник


Ответы (1)


Не уверен, не проверив полный код, но похоже, что pipeFactor.getPipeline() всегда будет создавать конвейер new в вашем случае. Поскольку это фабрика, она будет каждый раз создавать обработчики. Добавьте еще один sysout вместо this.pipelineFactory.getPipeline(), и если вы видите 3 разных хэш-кода объекта, то это и есть основная причина.
Решением может быть pipeline = this.pipelineFactory.getPipeline(), а затем использование pipeline для добавления удаления и т. д.
Также для записи, это в любом случае кажется неправильным использованием, вы должны получать конвейер из объекта ChannelHandlerContext либо в методе decode, либо в методе messageReceived обработчика.

person Abe    schedule 01.02.2013
comment
Я понимаю, что вы говорите о правильном использовании. Я экспериментировал с возможностью загрузить все мои обработчики в конвейере, а затем удалить несколько избранных, прежде чем начать прослушивание порта. Я хочу передать параметр, относящийся к отладке, который подскажет мне, удалять ли обработчики. - person MLightheart; 01.02.2013
comment
Я попробовал то, что вы предложили (я пробовал это раньше), но ничего не произошло: ChannelPipeline cp = this.pipelineFactory.getPipeline(); cp.remove (шестнадцатеричный дамп); - person MLightheart; 01.02.2013
comment
Я вывожу this.pipelineFactory.getPipeline().hashCode()) и возвращаю конвейер › 545768040. Когда я вывожу this.pipelineFactory.getPipeline(), я получаю это: DefaultChannelPipeline{(framer = xxx.nettynio.VariableLengthFrameDecoder), (hexdump = xxx.nettynio.HexDumpHandler), (обработчик = xxx.nettynio.ListenerServerHandler)}. - person MLightheart; 01.02.2013
comment
Каждый раз, когда вы вызываете getPipeline(), вы создаете новый конвейер. Вы удаляете обработчик из конвейера, а затем получаете новый; Конечно, он будет содержать экземпляры всех обработчиков. - person Brian Roach; 04.02.2013
comment
Хорошо, я следую за тобой. Я был смущен там. Если я получу конвейер, изменю его, а затем добавлю Pipeline (не PipelineFactory) в начальную загрузку, это будет нормально? Использование this.bootstrap.setPipeline(myNewPipeline); вместо this.bootstrap.setPipelineFactory(this.pipelineFactory);. - person MLightheart; 05.02.2013
comment
Я вижу, что использование setPipeline() устанавливает ChannelPipeline по умолчанию, который клонируется при создании нового канала. А использование setPipelineFactory() устанавливает ChannelPipelineFactory, который создает новый ChannelPipeline для каждого нового канала. Есть ли проблемы с использованием setPipeline() для начальной загрузки? - person MLightheart; 05.02.2013
comment
Это внутренняя деталь реализации, которую вы используете, поэтому единственная проблема может быть изменена в будущем выпуске. - person Abe; 06.02.2013