我在51cto写文章,只是为了记录自己的记忆,毕竟好记性不如烂笔头。不是为了博眼球,吸引粉丝。

这篇文章,我来讲解下NIO里的2个重要的概念:pipeline和handlers。

在设计模式里面提到过一种责任链的模式,责任链模式简单说就是击鼓传花,一个任务,顺着链按个触发。想详细了解责任链模式的读者,请自己百度,设计模式不在这篇文章讨论范围之内。如果把数据比做水,那么pipeline就是水管,水管上的阀门就是处理水的部分。比如一个Request请求进来,可能经过层层的处理;响应也是,所以类似这种服务端的框架很适合使用pipeline来解决。

其中的HandlerContext就是上面讲的阀门,包括拦截器模式,Filter模式它们的实现都是类似的,全部是基于责任链的变体。每个HandlerContext都聚合一个Handler,由Handler负责具体的逻辑处理。

我们再来看下Netty中ChannelHandler的类图:

ChannelHandler有两个子类ChannelInboundHandler和ChannelOutboundHandler,这两个类对应了两个数据流向,如果数据是从外部流入我们的应用程序,我们就看做是inbound,相反便是outbound。一个ChannelHandler处理完接收到的数据会传给下一个Handler,或者什么不处理,直接传递给下一个--责任链模式。

上图中我们可以看到,一个ChannelPipeline可以把两种Handler(ChannelInboundHandler和ChannelOutboundHandler)混合在一起,当一个数据流进入ChannelPipeline时,它会从ChannelPipeline头部开始传给第一个ChannelInboundHandler,当第一个处理完后再传给下一个,一直传递到管道的尾部。与之相对应的是,当数据被写出时,它会从管道的尾部开始,先经过管道尾部的“最后”一个ChannelOutboundHandler,当它处理完成后会传递给前一个ChannelOutboundHandler。

这里需要注意:1)Netty中,可以注册多个handler。ChannelInboundHandler按照注册的先后顺序执行;ChannelOutboundHandler按照注册的先后顺序逆序执行。

2)ChannelInboundHandler之间的传递,通过调用 ctx.fireChannelRead(msg) 实现;而调用ctx.write(msg) 将传递到ChannelOutboundHandler。ctx.write()方法执行后,需要调用flush()方法才能令它立即执行。

3)ChannelOutboundHandler 在注册的时候需要放在最后一个ChannelInboundHandler之前,否则将无法传递到ChannelOutboundHandler。

InboundHandler和OutboundHandler在ChannelPipeline中是混合在一起的,那么它们如何区分彼此呢?其实很容易,因为它们各自实现的是不同的接口,对于inbound event,Netty会自动跳过OutboundHandler;相反若是outbound event,ChannelInboundHandler会被忽略掉。

最后,我们再来总结下几个概念:1)不管是server还是client,每个连接都会对应一个pipeline,该pipeline在Channel被创建的时候创建。

2)ChannelPipeline是ChannelHandler的容器,它包含了一个ChannelHander形成的列表,且所有ChannelHandler都会注册到ChannelPipeline中。其中ChannelHander用于处理连接的Inbound或者Outbound事件。

3)ChannelPipeline,它维护了一个有序的ChannelHandler列表,但并非是直接关联,而是通过维护ChannelHandlerContext进行关联。

4)一个ChannelHandlerContext只能对应一个ChannelHander,只对应一个Channel;而一个ChannelHander则可以对应多个ChannelHandlerContext。

java pipeline模式_NIO系列-4: 彻底搞明白Pipeline和Handler相关推荐

  1. java的向下转型_终于搞明白向下转型的作用了,还不懂的进来看下.

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 之前一直搞不明白,向下转型的实际意义,虽然知道向下转型怎么写, 现在我来讲解下 向下转型 的实际作用,如果有错的话,大家可以指出, 如果认为我说的对的话可 ...

  2. Java开发面试问题,2021年Java进阶者的新篇章,终于搞明白了

    前言 很多Java程序员一直希望找到一份完整的学习路径,但是市面上很多书都是专注某一个领域的,没有一份完整的大图,以至于很多程序员很迷茫,不知道自己到底应该从哪里开始学,或者不知道自己学习些什么. 好 ...

  3. Java面试题基础系列

    Java面试题基础系列 1.面向对象的特征有哪些方面? 面向对象的特征主要有以下几个方面:抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面.抽象只关注对象有哪些属性和 ...

  4. 2022年Java面试题基础系列228道(1),快看看哪些你还不会?

    Java面试题(一) 1.面向对象的特征有哪些方面? 2.访问修饰符 public,private,protected,以及不写(默认)时的区别? 3.String 是最基本的数据类型吗? 4.flo ...

  5. Java面试题基础系列228道(1),快看看哪些你还不会?

    Java面试题(一) 1.面向对象的特征有哪些方面? 2.访问修饰符 public,private,protected,以及不写(默认)时的区别? 3.String 是最基本的数据类型吗? 4.flo ...

  6. Java坑人面试题系列: 线程/线程池(高级难度)

    ExecutorService 接口及相关API细节详解. Java Magazine上面有一个专门坑人的面试题系列: https://blogs.oracle.com/javamagazine/qu ...

  7. Java基础面试题系列

    本文收集了一些经典的Java面试题 1.面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面.抽象只关 ...

  8. 《JAVA与模式》之策略模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述策略(Strategy)模式的: 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它 ...

  9. Java基础复习笔记系列 九 网络编程

    Java基础复习笔记系列之 网络编程 学习资料参考: 1.http://www.icoolxue.com/ 2. 1.网络编程的基础概念. TCP/IP协议:Socket编程:IP地址. 中国和美国之 ...

最新文章

  1. NYOJ 630 Problem of IP
  2. C++异常处理(try catch throw)完全攻略
  3. 11 步教你选择最稳定的 MySQL 版本
  4. 常州网站服务器_常州服务器
  5. union的限制, 临时表大小的优化
  6. asp.net 导出word文档
  7. java 线程概念_java并发编程之 java线程基本概念
  8. GDI+图像去污——四周去污
  9. 微软良心伙伴,OneDrive首发支持iOS11的文件App
  10. 本题要求实现一个计算非负整数阶乘的简单函数
  11. IOS – OpenGL ES 图像加亮边缘 GPUImage3x3ConvolutionFilter
  12. PhotoShop彩色图片打印机只有四中颜色操作步骤:
  13. Kali PPPoE 拨号上网
  14. linux怎么在终端里查系统信息,Neofetch:在终端中显示Linux系统信息
  15. java计算机毕业设计springboot+vue足球联赛管理系统
  16. HTML代码 ol ol表示,htmlol标签的使用与定义详解
  17. 极验验证码逆向(二)
  18. 数据结构—图(Part Ⅱ)—最小生成树 最短路径
  19. 计算机桌面空白地方鼠标右击没有属性选项,Win7系统右键计算机属性不见了怎么办...
  20. FreeSWITCH基本操作

热门文章

  1. typeof NaN的结果是什么?
  2. 49.1%的MCN机构尚未盈利,影响盈利的因素有哪些?突破点在哪里?
  3. LeetCode Jump Game Jump GameII
  4. 构建数据中台的组织架构
  5. nala创始人刘勇明:30条值得你借鉴的好习惯
  6. 网络教学资源平台设计与实现--公告发布系统数据表
  7. 详解树莓派Model B+控制蜂鸣器演奏乐曲
  8. Untiy3d-unity游戏性能优化-详细介绍
  9. 学校铃声Java_java_java多线程抓取铃声多多官网的铃声数据,一直想练习下java多线程抓取数 - phpStudy...
  10. LoRa 无线通信模块 之 发送0.01V