Netty
2020-04-25 13:42:37 0 举报
Netty流程
作者其他创作
大纲/内容
NioEventLoop#processSelectedKeysOptimized1.处理感兴趣的事件
新连接
AbstractChannel.AbstractUnsafe#register1.判断当前线程是否是channel绑定的线程如果是直接regist,如果不是封装成任务放到所绑定的NioEventLoop的任务队列里面
NioSocketChannel#构造器
DefaultSelectStrategyFactorypublic static final SelectStrategyFactory INSTANCE = new DefaultSelectStrategyFactory();直接获取此类
AbstractNioByteChannel#构造器1.此channel为OP_READ事件
Runnable#run1.将当前的线程绑定到NioEventLoop2.启动当前eventLoop的run方法
DefaultChannelPromise#trySuccess
MultithreadEventExecutorGroup#newDefaultThreadFactory新建new DefaultThreadFactory(getClass())
NioEventLoop#run1.如果队列中有需要执行的任务那么则不进入select监听端口,轮询channel2.如果没有需要执行的任务则选择策略进入响应的方案3.如果是SELECT事件则进入select监听端口,轮询channel感兴趣的事件,并设置死亡时间相关操作
DefaultChannelPromise#setSuccess0CAS将result更新为SUCCESS对象
SelectorProvider#provider如果有实例则返回,没有的话利用反射返回
AbstractBootstrap#bind(port)
NioEventLoop#newTaskQueue
NioEventLoop#newTaskQueue0创建MpscQueue,这个队列的特性是 非阻塞的,多生产者多消费者
new ThreadPerTaskExecutor(newDefaultThreadFactory());初始化executor
NioEventLoop#构造器调用父类构造器中有一个方法创建新的队列
pipeline.fireChannelActive()1.这里的isActive()方法和serverSocketChannel中的不一样所以会调用初始化激活方法链
Netty
NioSocketChannel#read
SingleThreadEventLoop#构造器tailTasks = newTaskQueue()
channelFactory.newChannel()利用反射初始化你自定义的NioServerSocketChannel
AbstractNioChannel#safeSetSuccess1.将promise启动状态更新成SUCCESS
AbstractBootstrap#doBind主要方法1.创建serversocketchannel2.初始化serversocketchannel3.启动bossGroup
allocHandle.incMessagesRead(localRead);1.对连接的客户端进行计数
AbstractNioChannel#doRegister1.这里将channel本身注册进了NioEventLoop中的选择器
NioEventLoop#processSelectedKeys处理特殊事件
回调
用来处理已经被接收的连接,一旦bossGroup接收到连接,就会把连接信息注册到workerGroup上EventLoopGroup workerGroup = new NioEventLoopGroup();
ServerBootstrap sbs = new ServerBootstrap();
ServerBootstrap#childHandler1.添加SocketChannel的handler
DefaultChannelPipeline#fireChannelRead1.调用读取处理链2.前面注册了ServerBootstrapAcceptor调用其中的channelRead方法
DefaultEventExecutorChooserFactorypublic static final DefaultEventExecutorChooserFactory INSTANCE = new DefaultEventExecutorChooserFactory();
DefaultChannelPipeline#fireChannelRegistered1.调用pipeline的register调用链
MultithreadEventLoopGroup#register1.bossGrop注册channel
ServerBootstrap#channel1.新建ReflectiveChannelFactory对象,用来创建一个新的channel如何接收进来的连接2.将channelFactory赋值为此工厂
这里最终回调bind绑定端口的时候会调用AbstractNioChannel#doBeginRead()方法来进行监听事件的二次注册
NioServerSocketChannel#构造器this(newSocket(DEFAULT_SELECTOR_PROVIDER)新建serverSocketChannel
NioEventLoop#openSelector()初始化selecotr
AbstractNioChannel#doBeginRead1.对监听事件进行二次注册
children = new EventExecutor[nThreads];新建一个EventLoop数组
AbstractChannel.AbstractUnsafe#register01.注册channel到选择器中2.启动pipeline的调用3.调用自己的register0方法
SingleThreadEventExecutor#execute1.判断当前线程是否是绑定的线程2.将任务添加到taskqueue队列3.如果不是在当前线程启动线程
NioEventLoop#processSelectedKeys1.连接到来时会调用此方法
ServerBootstrap#group1.将bossGroup和workerGroup导入 2.父类AbstractBootstrap设置bossGroup3.本身设置workerGroup
AbstractBootstrap#doBind01.将channel绑定端口封装成任务丢到NioEventLoop的队列中
ServerBootstrap#handler1.添加serverSocketChannel的handler
SingleThreadEventExecutor#startThread1.因为此EventLoop未启动所以没有绑定线程调用此方法启动2.利用CAS更新线程的state状态为启动ST_NOT_STARTED -> ST_NOT_STARTED
SingleThreadEventExecutor#构造器taskQueue = newTaskQueue()
ServerBootstrap#option1.添加serverSocketChannel的配置
WindowsSelectorImpl#openSelector();
HeadContext#channelActive
AbstractNioMessageChannel.NioMessageUnsafe#read
AbstractBootstrap#initAndRegister1.初始化channel2.注册channel
AbstractChannel#register01.注册SocketChannel的主要方法
ChannelInitializer#channelRegistered1.最会调用到初始化channel中添加的ChannelInitializer的channelRegistered方法
ThreadPerTaskExecutor#doStartThread1.利用此executor启动线程
ThreadPerTaskExecutor#构造器threadFactory = DefaultThreadFactory
AbstractChannel#构造器1.初始化内部类unsafe2.初始化pipeline
selectedKeys = selectedKeySet
DefaultThreadFactory#newThread1.创建FastThreadLocalThread返回后并启动
ChannelInitializer#initChannel1.调用重写的initChannel方法2.将ServerBootstrapAcceptor放到pipeline中,并封装成task丢到线程的任务队列中
NioEventLoop#processSelectedKey1.找到对应的事件处理方法2.可读事件和连接事件调用同一个方法
ServerBootstrap#init1.初始化Channel的配置2.初始化Channel的属性3.给Channel的pipeline添加ChannelInitializer作用是给serverSocketChanne添加一个初始化SocketChannel的handler
MultithreadEventExecutorGroup#构造器这里做了大量的初始化操作1.初始化executor线程工厂2.初始化EventLoop数组3.初始化chooser选择器
ServerBootstrap#childOption1.添加socketChannel的配置
MultithreadEventExecutorGroup#next()1.选择NioEventLoop
NioSocketChannel#doReadMessages1.新建一个socketChannel对象主要对应一个客户端2.SocketChannel ch = SocketUtils.accept(javaChannel());新建一个SocketChannel并传入SocketChannel里面
NioEventLoopGroup#newChildnew NioEventLoop新建EventLoop对象并将前面初始化的选择器,选择器工厂,拒绝策略传入构造器参数
新连接接入
Class.forName( \"sun.nio.ch.SelectorImpl\
用来接收进来的连接EventLoopGroup bossGroup = new NioEventLoopGroup();
ServerBootstrapAcceptor#channelRead1.在这里完成对NioSocketChannel的设置初始化2.完成workGroup的启动3.将channel注册到workGroup中
Thread
SingleThreadEventExecutor#runAllTasks如果ioRatio != 100,并且没有轮询到感兴趣的事件发生则调用队列中的任务
this.selector = selectorTuple.selector;
SingleThreadEventLoop#register1.注册channel2.新建DefaultChannelPromise类作为返回对象
0 条评论
下一页