Netty源码导读
2020-06-16 17:39:24 32 举报
AI智能生成
netty源码导读
作者其他创作
大纲/内容
新连接接入
检测到有新的连接
1.channel.unsafe
2.unsafe.read()
1.doReadMessages(List<Object> readBuf)
2.pipeline.fireChannelRead(NioSocketChannel-readBuf.get(i))
pipeline
初始化
用户添加自定义流程,p.addLast()
1.检查是否有重复handler
2.创建节点
3.添加节点addLast0(context)
4.回调用户方法
pipeline的重要知识点
unsafe
pipeline.fireChannelRead(byteBuf)
pipeline.writeAndFlush(msg)
服务端启动流程
设置启动参数
nioEventLoopGroup
channel
b.bind()
initAndRegister
new NioServersocketChannel
ch
channelConfig
SelectionKey.OP_ACCEPT
id
unsafe
pipeline
tail
head
initChannel
设置options到ChannelConfig
设置attrs到channel.attr
设置新接入channel的option和attr
pipeline中添加ServerBootstrapAcceptor
bossGroup.next().register(channel)
new channelPromise(channel, nioEventLoop)
channel.unsafe.register(eventLoop,channelPromise)
添加NioEventLoop到channel.eventloop
doRegister()
SelectableChannel.register(eventloop.selector,0.channel)
channel.pipeline.fireChannelRegistered
chanel.pipeline.invokeHandlerAddedIfNeeded
doBind0(fegFuture,channel,address,promise)
调用eventLoop异步执行channel.bind
最终调用unsafe.bind()
javaChannel.socket.bind()真正端口绑定
pipeline.fireChannelActive
reactor线程
启动
executor.execute
执行
select
定时任务到时,跳出循环
轮询过程中发现有任务加入,跳出循环
阻塞式select操作
解决jdk的nio 空轮询bug
processSelectedKeys
取出IO事件以及对应的channel
处理channel
判断是否该再来次轮询
runAllTasks
用户自定义普通任务
1.NioEventLoop.execute(runnable)
2.offterTask(task)
3.netty内部使用taskQueue将task保存
非当前reactor线程调用channel的各种方法
用户自定义定时任务
reactor线程task的调度(runAllTasks)
从scheduledTaskQueue转移定时任务到taskQueue(mpsc queue)
计算本次任务循环的截止时间
执行任务
收尾
0 条评论
下一页