专栏首页后端技术学习Netty流程学习一-netty启动服务

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

问题:我们的线程: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中。

其流程:

本文分享自微信公众号 - 后端技术学习(gh_9f5627e6cc61),作者:路行的亚洲

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-12-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • pmq学习一-一些典型的使用和套路

    pmq是信也科技开源的一款消息中间件,虽然没有RocketMQ和Kafka出名,但是里面的代码还是有值得我们学习的地方的。

    路行的亚洲
  • 设计模式之装饰者模式

    在前面我们看到了单例模式的使用,在dubbo中,同样有单例模式的使用,找到dubbo中的ExtensionLoader类可以看到这样的代码:

    路行的亚洲
  • ThreadPoolExecutor源码学习

    但点进去看newSingleThreadExecutor可以看到其会调用ThreadPoolExecutor里面的线程。因此有必要研究ThreadPoolExe...

    路行的亚洲
  • ROB评说 | 无人机是高大上还是已经平民化?

    【专家帮你计算机器人的投资回报率:成本VS现金流】客户需要更快、更好、更便宜的产品,竞争对手正在逼近目标,持续盈利能力的赌注越来越高。机器人自动化也许能带给你优...

    机器人网
  • npm学习

    1、 npm install <name>安装nodejs的依赖包 2、 **npm install <name> -g **将包安装到全局环境中 3、 ...

    _simple
  • 机器人速度与分离监控实例

    在同一个协同空间内,机器人和操作人员是允许同时在空间内进行移动的。但为了保障操作人员的安全,需要通过安全技术检测人员和机器人之间的距离。

    机器人网
  • 推荐 | 对话李泽湘:办公室每个星期都有风投等着

    东莞启动“机器换人”还不到一年,资本狂欢与工厂变革急速出现。而这一切的幕后推手及精英团队却鲜为人知。狂潮中,政府、银行、融资公司及“最强大脑”型的学者都在助力。...

    机器人网
  • 脑洞清奇,日本工程师造出“自动驾驶”鸭子机器人,要给稻田除草

    Aigamo的底盘大约60平方厘米,重1.5千克,可以借助WiFi和GPS在稻田里飘在水面上游啊游,自动驾驶。它还长了两个眼睛,一眼看上去像是一个萌版的扫地机器...

    量子位
  • Cypress(一)Windows环境Cypress环境搭建

    Linux Ubuntu 12.04 及以上, Fedora 21 and Debian 8 (64位)

    周辰晨
  • Mysql 常用函数(3)- ifnull 函数

    https://www.cnblogs.com/poloyy/p/12890763.html

    小菠萝测试笔记

扫码关注云+社区

领取腾讯云代金券