从管道中删除处理程序

时间:2013-01-31 22:40:51

标签: handler netty pipeline

我试图从我的处理程序管道中删除某个处理程序,但是我在执行它时遇到了麻烦。当我在管道之前和之后列出处理程序时,我试图删除的处理程序仍然存在。那么我在这里做错了什么?这是一段代码片段。所有这些都处于启动阶段。你可以看到我做的最后一件事是配置管道工厂。我使用的是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

1 个答案:

答案 0 :(得分:3)

不确定没有检查完整代码,但看起来像pipelineFactor.getPipeline()将始终在您的情况下创建管道。自从它成为工厂以来,每次都会创建处理程序。为sysout添加一个this.pipelineFactory.getPipeline(),如果您看到3个不同的对象哈希码,那么这就是根本原因。 解决方案可以是pipeline = this.pipelineFactory.getPipeline(),然后使用pipeline添加删除等 另外,对于记录而言,似乎错误的用法,您应该使用ChannelHandlerContext方法或处理程序的decode方法从messageReceived对象获取管道。