记事本

仅仅是一个记事本

netty的Pipeline里面的执行定制模型顺序问题
最近在看netty的书,在处理粘包问题的时候,我按照上面的代码执行,但是粘包问题还是存在,而且有时候还不只是粘包的问题,还会报错。
后来发现我的Pipeline没有按照他的顺序,我开始的时候以为这个是随便顺便的,后来发现顺序不对还会出问题。
然后自己就往里面挖了一下,不是很深,发现他其实是一个链表的结构,一个接一个的顺序执行(没有看太底层,如果有错,请告知),同时也解决了我一个疑惑,就是为什么Pipeline的添加方法有那么多。addLast(),addFrist()这么多,因为他为了控制不同的位置,就如同拦截器一样(个人理解,可能不正确,但是目前看来应该是的),一层层的往下执行的。
他的最里面有一个AbstractChannelHandlerContext这个类,这个类实现了他的链表结构。
addlast最后执行的的方法是这个语句
private void addLast0(AbstractChannelHandlerContext newCtx) {
        AbstractChannelHandlerContext prev = tail.prev;
        newCtx.prev = prev;
        newCtx.next = tail;
        prev.next = newCtx;
        tail.prev = newCtx;
    }
里面有一个成员变量tail,这个变量是表示尾部的变量。可以通过这个变量找到这个链表的最后一个,有一个和他相反的变量head,这个是标识头部的变量。
newCtx在这个方法调用之前就new出来的一个对象。
通过这个方法可以看出,他直接把这个元素添加到链表里面去了。这个元素成了tail的前一个元素。

然后后面Netty在生效的时候就如同拦截器一样,一层层的往下执行。所以你如果要使用他们的这些功能,那么你自己Handler必须写在最后一个,然后他们每一层之间也是有顺序的,顺序后续再总结,你可以自己在网上查一下。

同时每一级可能会影响到下一级的参数问题,例如StringDecoder这个就会把channelRead里面的msg强转为String对象,而不是默认的ByteBuf对象,会报类型转换错误。

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/BB_huiyi/article/details/53308792
文章标签: java netty
个人分类: netty java
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

netty的Pipeline里面的执行定制模型顺序问题

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭