Netty源码分析(七):初识ChannelPipeline
ChannelPipeline
单看名称就可以知道Channel
的管道。本篇将结合它的默认实现类DefaultChannelPipeline
来对它做一个简单的介绍。
示例图
上图是官方提供的ChannelPipeline
的事例图。IO请求经由ChannelOutboundHandler
中ChannelOutboundHandler
处理之后写出到服务端,服务接收到读入后,由ChannelInboundHandler
依次处理。
下面来看下DefaultChannelPipeline
的类图:
DefaultChannelPipeline
实现了ChannelPipeline
接口,而ChannelPipeline
又继承了ChannelInboundInvoker
、ChannelOutboundInvoker
和Iterable
。
ChannelInboundInvoker
:发起对ChannelPipeline
中下一个ChannelInboundHandler
的方法的调用。
ChannelOutboundInvoker
:发起对ChannelPipeline
中下一个ChannelOutboundHandler
的方法的调用。
Iterable
:可遍历ChannelPipeline
中的ChannelHandler
。
NioEventLoop
继承自SingleThreadEventLoop
,而SingleThreadEventLoop
又继承自SingleThreadEventExecutor
。
SingleThreadEventExecutor
内部持有一个Thread对象,是Netty
多线程的基础。
可以认为, 一个NioEventLoop
与一个特定的线程进行了绑定,并且在其生命周期内,绑定的线程都不会再改变。
DefaultChannelPipeline
DefaultChannelPipeline
的主要工作就是对ChannelHandler
的管理,包括ChannelHandler
的增减,事件的触发等。
ChannelHandler
的增减
以addFirst
方法为例:
public final ChannelPipeline addFirst(EventExecutorGroup group, String name, ChannelHandler handler) {
final AbstractChannelHandlerContext newCtx;
synchronized (this) {
// 检查handler是否可以共享
checkMultiplicity(handler);
// 给AbstractChannelHandlerContext起个独立的名字
name = filterName(name, handler);
// 创建DefaultChannelHandlerContext
newCtx = newContext(group, name, handler);
// 执行实际的添加操作
addFirst0(newCtx);
// channel尚未注册到eventloop
if (!registered) {
// 设置newCtx的状态为ADD_PENDING
newCtx.setAddPending();
// 设置过一会回调ChannelHandler的handlerAdded方法
callHandlerCallbackLater(newCtx, true);
return this;
}
EventExecutor executor = newCtx.executor();
if (!executor.inEventLoop()) {
newCtx.setAddPending();
executor.execute(new Runnable() {
@Override
public void run() {
callHandlerAdded0(newCtx);
}
});
return this;
}
}
callHandlerAdded0(newCtx);
return this;
}
addFirst
方法先检查添加的ChannelHandler
是否可以共享(判断共享的方法是对于每个channel当前ChannelHandler是否需要不同的状态),再创建ChannelHandler
的上下文关系,使ChannelHandler
以链表方式存在于ChannelPipeline
中。当ChannelHandler
添加成功后,再调用ChannelHandler
的handlerAdded
方法。其它的添加方式和addFirst
类似。
事件触发
以fireChannelActive
方法为例:
public final ChannelPipeline fireChannelActive() {
AbstractChannelHandlerContext.invokeChannelActive(head);
return this;
}
从HeadContext
的head开始,依次触发下一个ChannelHandler
的channelActive
方法。
本篇简单介绍了ChannelPipeline
的相关概念,当ChannelHandler
介绍完后,再具体介绍ChannelPipeline
中的HeadContext
和TailContext
。
文中帖的代码注释全在:KAMIJYOUDOUMA, 有兴趣的童鞋可以关注一下。
本篇到此结束,如果读完觉得有收获的话,欢迎点赞、关注、加公众号【贰级天災】,查阅更多精彩历史!!!
Netty源码分析(七):初识ChannelPipeline的更多相关文章
- Netty源码分析第7章(编码器和写数据)---->第3节: 写buffer队列
Netty源码分析七章: 编码器和写数据 第三节: 写buffer队列 之前的小节我们介绍过, writeAndFlush方法其实最终会调用write和flush方法 write方法最终会传递到hea ...
- Netty源码分析 (七)----- read过程 源码分析
在上一篇文章中,我们分析了processSelectedKey这个方法中的accept过程,本文将分析一下work线程中的read过程. private static void processSele ...
- Netty 源码分析——ChannelPipeline
Netty 源码分析--ChannelPipeline 通过前面的两章我们分析了客户端和服务端的流程代码,其中在初始化 Channel 的时候一定会看到一个 ChannelPipeline.所以在 N ...
- Netty源码分析第4章(pipeline)---->第7节: 前章节内容回顾
Netty源码分析第四章: pipeline 第七节: 前章节内容回顾 我们在第一章和第三章中, 遗留了很多有关事件传输的相关逻辑, 这里带大家一一回顾 首先看两个问题: 1.在客户端接入的时候, N ...
- netty源码分析之二:accept请求
我在前面说过了server的启动,差不多可以看到netty nio主要的东西包括了:nioEventLoop,nioMessageUnsafe,channelPipeline,channelHandl ...
- Netty源码分析(前言, 概述及目录)
Netty源码分析(完整版) 前言 前段时间公司准备改造redis的客户端, 原生的客户端是阻塞式链接, 并且链接池初始化的链接数并不高, 高并发场景会有获取不到连接的尴尬, 所以考虑了用netty长 ...
- Netty源码分析第1章(Netty启动流程)---->第3节: 服务端channel初始化
Netty源码分析第一章:Netty启动流程 第三节:服务端channel初始化 回顾上一小节的initAndRegister()方法: final ChannelFuture initAndRe ...
- Netty源码分析第2章(NioEventLoop)---->第7节: 处理IO事件
Netty源码分析第二章: NioEventLoop 第七节:处理IO事件 上一小节我们了解了执行select()操作的相关逻辑, 这一小节我们继续学习select()之后, 轮询到io事件的相关 ...
- Netty源码分析第3章(客户端接入流程)---->第2节: 处理接入事件之handle的创建
Netty源码分析第三章: 客户端接入流程 第二节: 处理接入事件之handle的创建 上一小节我们剖析完成了与channel绑定的ChannelConfig初始化相关的流程, 这一小节继续剖析客户端 ...
- Netty源码分析第3章(客户端接入流程)---->第3节: NioSocketChannel的创建
Netty源码分析第三章: 客户端接入流程 第三节: NioSocketChannel的创建 回到上一小节的read()方法: public void read() { //必须是NioEventLo ...
随机推荐
- maven采用tomcat7启动项目
1.maven 集成tomcat7启动项目 <plugin> <groupId>org.apache.tomcat.maven</groupId> <arti ...
- 计算机行业工作者-->面试的总结博文(【*持续补充】)
1.博文题目:找实习/工作经验心得分享-偏IT技术向 http://blog.csdn.net/koudaidai/article/details/8063288 2.博文题目:百度,阿里 笔试面试 ...
- iOS数据持久化存储之归档NSKeyedArchiver
归档是一种很常用的文件储存方法,几乎任何类型的对象都能够被归档储存(实际上是一种文件保存的形式),收集了网上的一些资料并结合自己的一些经验,总结如下. 一.使用archiveRootObject进行简 ...
- 解决ini-parser解析ini文件中文乱码问题
rickyah/ini-parser 是一个.net 平台解析ini文件的库,当ini文件中含有中文字符时会乱码. 解决:将文件通过Editplus 等文本编辑工具保存为 utf-8 + bom 格式 ...
- 城市旅游ppt模板
城市旅游ppt模板,城市,旅游,旅行,休闲. 下载:http://www.huiyi8.com/lvyoumuban/ppt/
- linux命令学习笔记(46):vmstat命令
vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存.进程.CPU活动 进行监控.他是对系统的整体情况进行统计,不足之处是无法对某个进程进行 ...
- 网络编程学习笔记-TCP拥塞控制机制
为了防止网络的拥塞现象,TCP提出了一系列的拥塞控制机制.最初由V. Jacobson在1988年的论文中提出的TCP的拥塞控制由“慢启动(Slow start)”和“拥塞避免(Congestion ...
- AtCoder Beginner Contest 106 2018/08/18
A - Garden Time limit : 2sec / Memory limit : 1000MB Score: 100 points Problem Statement There is a ...
- 一行代码解决IE6/7/8/9/10兼容问题
百度源代码如下 <!Doctype html><html xmlns=http://www.w3.org/1999/xhtml xmlns:bd=http://www.baidu.c ...
- 参数化之利用CSV Data Set Config从文件读取参数并关联变量
众所周知,在进行接口测试的过程中,需要创建不同的场景(不同条件的输入,来验证不同的入参的返回结果).因而,在日常的自动化接口监控或商品监控等线上监控过程中,需要配置大量的入参来监控接口的返回是否正确. ...