Netty源码分析
2019-01-26 13:54:20 0 举报
本图是一份对Netty的源码总结,对Netty的工作原理有着较为完整的描述
作者其他创作
大纲/内容
SingleThreadEventExcutor:: thread
addLast()
Runable
NioEventLoop extends SingleThreadEventExcutor
SingleThreadEventExcutor1
head(outHandler)
……
SelectedSelectionKeySet
pipeLine
SingleThreadEventExcutor2
当一个客户端发起连接请求时,OP_ACCEPT事件会准备就绪,执行doReadMessage方法,即:根据当前请求创建一个NioSocketChannel,并遍历整个pipline,触发ServerBootStrapAcceptor的chanenelRead方法
handler
NioSocketChannel
doReadMessage()
Queue:taskQueue
tail(inHandler)
(3)利用next()选择下一个EventLoop
(4)register
设置一个死循环,不断执行以下内容:1.执行processSelectKeys():获得当前关联的channel,不断获取激活的事件,根据这个事件的类型,如OP_READ、OP_CONNET等,做不同处理2.执行runAllTasks():设置一个死循环,不断地从taskQueue中获取至少一个task去执行。注意:这个其实跟IO操作无关,有可能是执行一些定时任务
SocketChannelConfig
NioEventLoop:run()
最先执行的handler一定是放在这个双向链表的队尾,这就是为什么是addLast的原因
children:是一个SingleThreadEventExcutor数组
SingleThreadEventExcutorN
eventLoop
provider = SelectorProvider.provider()
ServerBootStrapAcceptor
ServerSocketChannelConfig
next():从children中随机获取一个可用的EventLoop,以供NioServerSocketChannel注册
ChannelHandlerContext
(1)
register
Selector selector = provider.openSelector()
NioServerSocketChannel
next():从children中随机获取一个可用的EventLoop,以供NioSocketChannel注册
readInterestOp :selectionKey.OP_ACCEPT
workGroup(NioEventLoopGroup)
BossGroup(NioEventLoopGroup)
(2)channelRead方法通知workGroup要分配一个EventLoop和这个新的NioSocketChannel关联
0 条评论
下一页