netty源码-管道工厂

前言:

认真学习过netty的人都知道,netty本质上就是java nio的一种多线程的实现。这里面有几个比较重要的类:

首先是NioServerBossPool(父类为AbstractNioBossPool)和NioWorkerPool(父类为AbstractNioWorkerPool)。这两个类中都包含了一个selector数组(即bosses数组和workers数组),其实这两个数组就是用来存放selector的。


在netty的源码中,Boss的数组大小默认是1,而worker数组的大小为最大线程数。线程池为我们传入的线程池。

另一个类是AbstractNioSelector 他的子类NioServerBoss和NioWorker。这三个类是netty实际执行时的执行体。他们实现了runnable接口。

简单的介绍完后,我来梳理下netty执行的流程:

1.初始化NioServerBossPool和NioWorkerPool,并创建bosses和workers

2.opernSelector执行Selector.open()并开启线程

3.执行process方法即线程的执行方法(该方法是AbstractNioSelector 的一个接口,在子类中有不同实现)

4.boss向taskQueue中添加任务,这里的任务其实就是向worker中的selector中添加socketChannel。这里采用的是生产者和消费者的模式。

5.worker执行读写。


因为这一篇是要详细介绍netty中管道的添加,所以boss和worker的工作原理的介绍就简略提一下。


现在进入正式内容。


首先管道的作用是用于我们在读写的时候进行一些附加的处理。比如说我们可能会添加一个编解码器或是一个handler如下面这样。


既然它们是要在读写的时候用的,那么它们多半会是在worker的线程中进行相应的一些处理。那这些管道是怎么添加和传递的呢?

我们找到worker的proccess方法(这个方法是worker线程执行的方法)


这一段如果知道nio的同学应该大概能够看懂它到底在干什么。我们这里需要注意的是read方法,我们进入read方法



这里注意这个fireMessageReceived(channel, buffer);方法,其中channel是通过key获得的

从代码中的注释可以知道该方法fire the event即释放事件,到底释放什么事件如何释放,接着看


可以看到它创建了一个UpstreamMessageEvent继续往下传递



你可以看到其实我们添加到官道里的handler是被维护成一个双向链表结构的。


如果是可以向上传递的则传递。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值