【问题标题】:Deleting handler from pipeline从管道中删除处理程序
【发布时间】:2013-02-01 16:08:30
【问题描述】:

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

【问题讨论】:

    标签: handler netty pipeline


    【解决方案1】:

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

    【讨论】:

    • 我明白你所说的正确使用方法。我正在尝试能够在管道中加载我的所有处理程序,然后在开始侦听端口之前删除一些选择。我想传入一个与调试相关的参数,它会告诉我是否删除处理程序。
    • 我尝试了您的建议(我之前尝试过)但没有任何反应:ChannelPipeline cp = this.pipelineFactory.getPipeline(); cp.remove("hexdump");
    • 我输出 this.pipelineFactory.getPipeline().hashCode()) 并返回管道 > 545768040。当我输出 this.pipelineFactory.getPipeline() 我得到这个: DefaultChannelPipeline{(framer = xxx. nettynio.VariableLengthFrameDecoder), (hexdump = xxx.nettynio.HexDumpHandler), (handler = xxx.nettynio.ListenerServerHandler)}。
    • 每次调用getPipeline() 时,您都在创建一个新管道。您正在从管道中删除一个处理程序,然后获取一个新的处理程序;它当然会包含所有处理程序的实例。
    • 好的,我跟着你。我在那里很困惑。如果我得到管道,更改它,然后将管道(而不是 PipelineFactory)添加到引导程序中可以吗?使用“this.bootstrap.setPipeline(myNewPipeline);”而不是“this.bootstrap.setPipelineFactory(this.pipelineFactory);”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 2020-03-20
    相关资源
    最近更新 更多