首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Netty流程学习一-netty启动服务

Netty流程学习一-netty启动服务

作者头像
路行的亚洲
发布2020-12-16 15:43:28
4190
发布2020-12-16 15:43:28
举报

问题:我们的线程:openSelector在什么时候创建的。

在创建NioEventLoop的时候,创建openSelector。

什么时候创建severSocketChannel、初始化serverSocketChannel,同时给serverSocketChannel从bossGroup中选择一个NioEventLoop

创建serverSocketChannel是在initAndRegister的时候,通过泛型+放射+工厂的方式创建serverSocketChannel。

而初始化则是设置channelOptions的相关参数信息、设置属性信息,同时通过channel的pipeline方法,添加一个channelInitializer,负责添加一个ServerBootstrapAcceptor Handler,添加完后,自己就移除了,可以看到初始化的过程会将channel、当前的线程组、当前的handler、当前的options、当前的attrs放入。

判断当前的eventLoop是不是NioEventLoop中的线程,如果是,则直接进行注册,否者需要执行eventLoop的execute操作,重写run方法,进行register0操作,此时会设置标识,方便注册后,设置对应的标识neverRegistered = false和registered = true。执行注册操作。

boss线程什么时候将serverSocketChannel注册到选择的NioEventLoop的selector,绑定地址启动,注册接收连接事件到selector上。

在AbstractNioChannel的doRegister中执行javaChannel().register(eventLoop().unwrappedSelector(), 0, this)拿到的结果是selectionKey,也即此时将eventLoop注册到了NioEventLoop的selector上。等着register完成来通知再执行bind。此时会添加监听。当promise的registered属性为true时,则执行doBind0操作。

此时会走到doBind0操作,此时会拿到channel的eventLoop的execute的run方法,执行bind操作,此时会走到pipeline中,此时可以看到pipeline中的操作中会包含head和tail,也即入站和出站的形式,可以看到headContext中的bind操作,在DefaultChannelPipe中,有bind方法unsafe.bind(localAddress, promise),此时会看到在NioServerSocketChannel中的doBind中会通过javaChannel中的bind方法进行绑定地址操作,然后执行。绑定后,才开始激活channelActive(ChannelHandlerContext ctx)。此时会执行两个操作:fireChannelActive和readIfIsAutoRead两个方法,此时可以看到read(ChannelHandlerContext ctx),此时会unsafe.beginRead(),这个时候在AbstractChannel中看到doBeginRead中执行注册interestOps和readInterestOps,此时会将readInterestOps=16这个事件注册到selectionKey中。

其流程:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-12-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 后端技术学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档