Netty分布式源码分析监听读事件

作者:向南是个万人迷 时间:2022-10-23 20:59:43 

前文传送门:NioSocketChannel注册到selector

我们回到AbstractUnsafe的register0()方法:

private void register0(ChannelPromise promise) {
   try {
       //省略代码
       //做实际的注册
       doRegister();
       neverRegistered = false;
       registered = true;
       //触发事件
       pipeline.invokeHandlerAddedIfNeeded();
       safeSetSuccess(promise);
       //触发注册成功事件
       pipeline.fireChannelRegistered();
       if (isActive()) {
           if (firstRegistration) {
               //传播active事件(4)
               pipeline.fireChannelActive();
           } else if (config().isAutoRead()) {
               beginRead();
           }
       }
   } catch (Throwable t) {
       //省略代码
   }
}

doRegister()做完实际的注册之后, 会走到if (isActive())这个判断, 因为这个时候链路已经完成, 所以这里是true, 默认判断条件if (firstRegistration)也为true, 所以这里会走到pipeline.fireChannelActive()这一步

有关pipeline我们会在下一章进行详细分析, 这里我们只需要知道, 最后会流转到AbstractUnsafe的beginRead()方法

跟到beginRead()方法:

public final void beginRead() {
   assertEventLoop();
   if (!isActive()) {
       return;
   }
   try {
       doBeginRead();
   } catch (final Exception e) {
       //代码省略
   }
}

这块代码同样我们也不陌生, 因为我们分析NioServerSocketChannel也分析过了这一步

我们继续跟到doBeginRead():

protected void doBeginRead() throws Exception {
   //拿到selectionKey
   final SelectionKey selectionKey = this.selectionKey;
   if (!selectionKey.isValid()) {
       return;
   }
   readPending = true;
   //获得感兴趣的事件
   final int interestOps = selectionKey.interestOps();
   //判断是不是对任何事件都不监听
   if ((interestOps & readInterestOp) == 0) {
       //此条件成立
       //将之前的accept事件注册, readInterest代表可以读取一个新连接的意思
       selectionKey.interestOps(interestOps | readInterestOp);
   }
}

这段代码相信大家会比较熟悉, 因为我们服务端channel注册完之后也走到了这里

因为我们在创建NioSocketChannel的时候初始化的是read事件, selectionKey是channel在注册时候返回的key, 所以selectionKey.interestOps(interestOps | readInterestOp)这一步, 会将当前channel的读事件注册到selector中去

注册完成之后, NioEventLoop就可以轮询当前channel的读事件了

章节小结

    本章学习了有关客户端接入, NioSocketChannel的创建, 注册等相关操作, 并且涉及到了上一小节剖析的eventLoop的相关逻辑, 同学们可以将相关的流程通过debug的方式走一遍以加深印象

来源:https://www.cnblogs.com/xiangnan6122/p/10204030.html

标签:Netty,分布式,监听读,事件
0
投稿

猜你喜欢

  • android获取当前运行Activity名字的方法

    2023-11-07 16:03:45
  • SpringBoot@DeleteMapping(/xxx/{id})请求报405的解决

    2022-06-13 14:00:48
  • Android中ImageView的使用方法

    2023-11-19 02:03:41
  • C#由当前日期计算相应的周一和周日的实例代码

    2021-12-02 00:37:09
  • Unity实现全屏截图以及QQ截图

    2023-07-25 17:12:22
  • 详谈java命令的本质逻辑揭秘

    2022-03-02 05:26:32
  • 常用的Java数据结构知识点汇总

    2022-09-09 02:26:02
  • C#中CheckedListBox控件的用法实例

    2021-08-05 06:03:29
  • 微信小程序微信登录的实现方法详解(JAVA后台)

    2023-08-29 12:37:25
  • 零基础学Java:Java开发工具 Eclipse 安装过程创建第一个Java项目及Eclipse的一些基础使用技巧

    2022-09-05 03:46:03
  • c#项目将dll打包到exe中的步骤

    2021-06-21 14:44:25
  • 解读JDK8踩坑JCE加密限制版本问题

    2021-09-20 12:42:35
  • Java设计模式之接口隔离原则精解

    2022-05-05 16:42:05
  • 使用Java代码来比较Android客户端版本号

    2021-09-07 17:44:22
  • C#实体类转换的两种方式小结

    2023-08-01 21:06:45
  • Java热门笔试试题整理

    2023-11-25 08:56:33
  • C#实现的阴历阳历互相转化类实例

    2021-12-24 06:41:39
  • Springboot+SpringSecurity+JWT实现用户登录和权限认证示例

    2021-11-14 11:06:11
  • JAVA 继承基本类、抽象类、接口介绍

    2022-11-11 00:09:40
  • 详解SpringBoot的事务管理

    2022-01-15 13:39:26
  • asp之家 软件编程 m.aspxhome.com