netty主流程之间的扭转
2020-09-16 10:47:03 1 举报
netty主流程流转
作者其他创作
大纲/内容
ServerBootstrapAcceptor
tail
Excutor
EventLoopGroup
AbstractChannel.AbstractUnsafe#register
SingleThreadEventExecutor#startThread
ChannelInitializer
ServerSocketChannel
其实就是对nio的serversocketChannel的封装
AbstractChannel()这里初始化AbstractChannel#newChannelPipeline
SingleThreadEventLoop#register(io.netty.channel.ChannelPromise)
ChannelPipeline#fireChannelRead(SocketChannel)这里调用的pipeline是NioServerSocketChannel中的pipeline
java.nio.channels.Selector#select(long)这里就是nio了,如果有连接事件过来,就会跳出循环
读数据请求
channelFactory.newChannel()
tail = new TailContext(this);
NioEventLoop本身就是一个线程池执行器
Client
AbstractChannel.AbstractUnsafe#safeSetSuccess
NioServerSocketChannel#doReadMessages
连接请求
Work EventLoopGroup
childGroup.register(child).addListener(new ChannelFutureListener()把SocketChannel注册到workGrop中重复NioServerSocketChannel注册的过程
taskQuene
NioEventLoop
NioEventLoop#run
ServerSocketChannel通道被初始化还没有注册到Selector上去
pipeline.fireChannelReadComplete();
AbstractNioByteChannel.NioByteUnsafe#closeOnRead
Pipeline(双向链表新的handle添加到中间)
ServerBootstrapAcceptor#channelRead
NioEventLoopGroup#newChild
DefaultChannelPipeline#invokeHandlerAddedIfNeeded
head
child.pipeline().addLast(childHandler);
SingleThreadEventExecutor#runAllTasks()
AbstractNioMessageChannel.NioMessageUnsafe#read
AbstractNioMessageChannel#AbstractNioMessageChannel
register0
都是一下通道注册时的回调方法的执行
ChannelPipeline#addLast(io.netty.channel.ChannelHandler...)
SingleThreadEventLoop#register(io.netty.channel.Channel)
NioEventLoop#processSelectedKeys处理OP_ACCPUT事件
ReflectiveChannelFactory#newChannel
handlerAdder的回调添加ChannelInitializer中的handler
Acceptor
SingleThreadEventExecutor.this.run();
读取事件的时候的事件回调
DefaultChannelPipeline#fireChannelActive
boolean inEventLoop = inEventLoop();//NioEventLoop中维护的线程 与点前执行的主线程不同所有未falseaddTask(task);if (!inEventLoop) { startThread();}
ChannelPipeline#fireExceptionCaught
ThreadPerTaskExecutor#execute
AbstractBootstrap#initAndRegister
AbstractBootstrap#doBind
ServerBootstrap#init
AbstractNioChannel#AbstractNioChannel
Selector(选择器)
DefaultChannelPromise#setSuccess()使用观察者模式回调GenericFutureListener#operationComplete
OP_ACCPUT事件
AbstractChannel.AbstractUnsafe#register0
NioEventLoop#select
DefaultChannelPipeline#fireChannelRegistered
netty网络模型
eventLoop就是一个线程池执行器(Excutors)
Boos EventLoopGroup
AbstractChannelHandlerContext.invokeChannelRegistered(head);
NioServerSocketChannel#NioServerSocketChannel()这个时候会初始化出来一个ServerSocketChannel同时给通道设置为一个OP_ACCEPT的感兴趣事件
AbstractNioChannel#doRegister把ServerSocketChannel注册到选择器上
head = new HeadContext(this);
pipeline.fireUserEventTriggerednetty实现心跳机制(关注一个shutDown事件)
//这里注册的是NioEvetLoopAbstractChannel.this.eventLoop = eventLoop;//这个是boos grop中的线程(NIOEventLoop) // 如果是父reactor的执行器的线程就注册这个通道 if (eventLoop.inEventLoop()) { register0(promise);} else { try { //如果不是父的reacto线程就往实现循环器中添加一个任务 eventLoop.execute(new Runnable() { @Override public void run() { register0(promise); } });}
把通道注册到选择器上
AbstractBootstrap#bind(int)
SingleThreadEventExecutor#execute
MultithreadEventLoopGroup#register(io.netty.channel.Channel)
NioEventLoop#processSelectedKeysOptimized
收藏
收藏
0 条评论
回复 删除
下一页