netty-epollEventGroup流程
2020-06-24 10:39:43 0 举报
netty epollEventGroup流程
作者其他创作
大纲/内容
addTask(task);
12
doRegister
其实就是EventLoopGroup,它的父类是SingleThreadEventLoop
group初始化流程
创建EpollServerSocketChannel给init方法
EpollEventLoop
SingleThreadEventLoop
10
run()
bossGroup
execute()
8
wakeup(inEventLoop);
11
epollInReady
执行的task队列
AbstractEpollChannel
channelFactory的初始化流程
accept(acceptedAddress);
childGroup.register(child)
轮询监听连接请求epollWait
startThread();
1
EpollServerSocketChannel
6
channel.unsafe()流程:通过前面的channelFactory().newChannel()可以知道,这个channel是EpollServerSocketChannel。-------------------------------------然后unsafe是在AbstractChannel的构造函数中初始化的如下:protected AbstractChannel(Channel parent) { this.parent = parent; unsafe = newUnsafe(); pipeline = newChannelPipeline(); }AbstractEpollServerChannel:protected AbstractEpollUnsafe newUnsafe() { return new EpollServerSocketUnsafe(); }-------------------------------------所以最终unsafe返回的是EpollServerSocketUnsafe
runnable
workGroup
clazz.newInstance()
EpollServerSocketUnsafe
BootstrapChannelFactory
channelFactory().newChannel();
3
register0
7
父子关系
workgroup流程
AbstractEpollStreamChannel
processReady
pipeline.fireChannelRead(byteBuf);
读取连接中可以读取的数据
register0()
register()
channelRead
pipeline.fireChannelRead
ServerBootstrapAcceptor
9
读取连接中可以accept的
init(channel);
AbstractChannel
2
16
5
14
init方法主要对channel进行了初始化,并且完了childGroup和childHandler的注册。
initAndRegister
AbstractBootstrap
bind()|doBind()
newChannel
1. startThread开启epoll轮询线程2. addTask,把register0任务嫁到task队列中。3. wakeup:第一步开启轮询后,没有连接进来会阻塞当前线程,所以第一次需要wakeup,当前线程,让它能够执行regsiter0
把childChannel再次注册到epoll中,进行监听读取数据
AbstractUnsafe
4
17
SingleThreadEventExecutor
newChildChannel
最后顺序触发pipeline中的channelRead函数
15
group().register(channel)
AbstractChannel的内部类
18
eventLoop.execute(new Runnable() { @Override public void run() { register0(promise); });第一次注册,会进入这个代码,这个代码会开启一个在bossGroup开启一个线程,来执行register0代码。
这个channel就是这个child
13
bossgroup流程
doRegister会调用:EpollEventLoop loop = (EpollEventLoop)eventLoop();loop.add(this);把事件注册到epoll中
0 条评论
下一页