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

原创 2016年11月23日 18:20:12
最近在看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对象,会报类型转换错误。

版权声明:本文为博主原创文章,未经博主允许不得转载。

Netty源码阅读笔记1:ChannelPipeline责任链模式

工作中接触到很多框架底层都采用了Netty作为通信组件,比如阿里的dubbo,蘑菇街的tesla等,于是对Netty产生了好奇,想看一看这个传说中的基于事件的异步IO框架到底是怎么实现的。经过断断续续...
  • zjuclh
  • zjuclh
  • 2016年03月29日 00:21
  • 1784

Netty学习(三)-Netty重要接口讲解

上一节我们写了一个HelloWorld,对于Netty的运行有了一定的了解,知道Netty是如何启动客户端和服务器端。这一节我们简要的讲解一下几个重要的接口,初步探讨Netty的运行机制,当然刚学Ne...
  • a953713428
  • a953713428
  • 2017年03月26日 18:10
  • 1837

Netty4学习笔记(1)-- ChannelPipeline

Netty4学习笔记(1)-- ChannelPipeline
  • SpiderDog
  • SpiderDog
  • 2013年12月12日 14:26
  • 21208

关于Netty Pipeline中Handler的执行顺序问题

最近在学习Netty框架,根据官网
  • wgyvip
  • wgyvip
  • 2014年05月12日 17:29
  • 4354

netty5笔记-总体流程分析2-ChannelPipeline

上一篇文章中,我们介绍了ServerBootstrap的启动过程,在这个过程中引出了一个很重要的类ChannelPipeline。如果说内存池,线程模型是netty的基础,我们接触的相对来说并不是那么...
  • youaremoon
  • youaremoon
  • 2015年12月27日 21:20
  • 4367

pipeline机制

最近在看netty的源码,准备将一些理解和总结写出来,netty的源码写的很漂亮理解起来也不是那么容易,很值得我们去学习和借鉴。我们知道在设计模式里面提到过一种责任链的模式,据我看一些源码的了解(不管...
  • tangyongzhe
  • tangyongzhe
  • 2015年11月27日 20:22
  • 2917

学习MongoDB 十一: MongoDB聚合(Aggregation Pipeline基础篇上)(三)

db.collection.aggregate()是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个节点的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应...
  • congcong68
  • congcong68
  • 2016年06月09日 10:47
  • 12601

nio学习之netty入门(2)---netty中handler的执行顺序

1、简介Handler在netty中,无疑占据着非常重要的地位。Handler与Servlet中的filter很像,通过Handler可以完成通讯报文的解码编码、拦截指定的报文、统一对日志错误进行处理...
  • tianjun2012
  • tianjun2012
  • 2016年12月21日 16:01
  • 1931

Netty pipeLine decode的顺序

/** * 初始化Bootstrap * @return */ public static final Bootstrap getBootstrap()...
  • AlbertFly
  • AlbertFly
  • 2016年08月01日 16:25
  • 2103

Netty4.0学习笔记系列之二:Handler的执行顺序

Handler在netty中,无疑占据着非常重要的地位。Handler与Servlet中的filter很像,通过Handler可以完成通讯报文的解码编码、拦截指定的报文、统一对日志错误进行处理、统一对...
  • u013252773
  • u013252773
  • 2014年03月13日 23:32
  • 28207
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:netty的Pipeline里面的执行定制模型顺序问题
举报原因:
原因补充:

(最多只允许输入30个字)