netty源码学习之channelHander的组织管理

当netty server启动时 调用bind方式 时 会开始注册serverChannel

netty源码学习之channelHander的组织管理

netty源码学习之channelHander的组织管理

netty源码学习之channelHander的组织管理

有必要说下 pipeline.addLast 方法

它在添加一个hander的时候 会把 把这个hander包装成 context 然后填加在 pipeline 的headContext 后面 如果没有注册时 会

if (!registered) {    newCtx.setAddPending();    //添加一个初始化逻辑  添加到 pipeline 里面   在对应channel 注册时    pipeline  会调用到它  (下面有分析)    callHandlerCallbackLater(newCtx, true);    return this;}那么 上面那段代码 他是异步的  它是什么时候 调用的呢   ?

netty源码学习之channelHander的组织管理

在调用 register方法 时 最终会走到

io.netty.channel.AbstractChannel.AbstractUnsafe#register0 里面

netty源码学习之channelHander的组织管理

划线那一步 就会调到

netty源码学习之channelHander的组织管理

上面说的那一步 一步逻辑里面 具体的逻辑 请看后面分析


ServerBootstrapAcceptor有什么用呢  它继承了  ChannelInboundHandlerAdapter  所以 当客户端 连接服务器时  会进入的它的read方法下面来看 它的read方法

netty源码学习之channelHander的组织管理
child.pipeline().addLast(childHandler); 这行很重要
childHandler  其实就是我们自己传的 初始化hander 一般形式 都是  下面红线这一块

netty源码学习之channelHander的组织管理

那么 child 是什么呢 其实很好理解 他就是 serverSocketChannel.accept 的到的那个 socketChannel

现在 服务器 在accept 之后 把 这个 socketChannel 注册 到 workGroup中的一个 eventLoop 里面 现在 进入 register方法里面

netty源码学习之channelHander的组织管理
invokeHandlerAddedIfNeeded() 只会调用一次    在具体了解 这个方法的逻辑之前 我们有必要知道 pipieline的 addLast 方法的逻辑
@Overridepublic final ChannelPipeline addLast(EventExecutorGroup group, String name, ChannelHandler handler) {    final AbstractChannelHandlerContext newCtx;    synchronized (this) {        checkMultiplicity(handler);        //生成一个新的 context        newCtx = newContext(group, filterName(name, handler), handler);       //将这个context添加到head后面   head ->newContext->tail        addLast0(newCtx);        //这里很重要  pipeline 还没有注册 那么 生成一个回调   它引用了我们刚刚生成的context    它将会在后续用到
// If the registered is false it means that the channel was not registered on an eventLoop yet.        // In this case we add the context to the pipeline and add a task that will call        // ChannelHandler.handlerAdded(...) once the channel is registered.        if (!registered) {            newCtx.setAddPending();            callHandlerCallbackLater(newCtx, true);            return this;        }        EventExecutor executor = newCtx.executor();        if (!executor.inEventLoop()) {            callHandlerAddedInEventLoop(newCtx, executor);            return this;        }    }    callHandlerAdded0(newCtx);    return this;}

现在进入

private void callHandlerAddedForAllHandlers() {    final PendingHandlerCallback pendingHandlerCallbackHead;    synchronized (this) {        assert !registered;        // This Channel itself was registered.        registered = true;        //这个就是我们刚刚 添加的那个回调     PendingHanderCallBack
pendingHandlerCallbackHead = this.pendingHandlerCallbackHead;        // Null out so it can be GC'ed.        this.pendingHandlerCallbackHead = null;    }    // This must happen outside of the synchronized(...) block as otherwise handlerAdded(...) may be called while    // holding the lock and so produce a deadlock if handlerAdded(...) will try to add another handler from outside    // the EventLoop.    PendingHandlerCallback task = pendingHandlerCallbackHead;    while (task != null) {         //开始执行          task.execute();        task = task.next;    }}task.execute  其实 逻辑就是 开始执行 我们的hander的 handerAdd方法   因为我们初始化hander继承了io.netty.channel.ChannelInitializer所以 下面看下它的逻辑

netty源码学习之channelHander的组织管理

netty源码学习之channelHander的组织管理

好 现在我们serverChannel.accept 得到的那个 channel 它的pipeline 已经 设置完毕了 继续流程

netty源码学习之channelHander的组织管理

ok 我们的accept 的 chanel注册完毕 且对应的pipeline 也这是完毕了 也出发了 对应的channel的 生命周期方法


Original: https://www.cnblogs.com/pupansheng/p/16261826.html
Author: 蒲蒲的博客
Title: netty源码学习之channelHander的组织管理

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/569549/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java面试指北!13个认证授权常见面试题/知识点总结!| JavaGuide

    大家好,我是 Guide哥!端午已过,又要开始工作学习啦! 我发现有很多小伙伴对认证授权方面的知识不是特别了解,搞不清 Session 认证、JWT 以及 Cookie 这些概念。…

    Java 2023年6月9日
    084
  • 从服务间的一次调用分析整个springcloud的调用过程(二)

    先看示例代码 @RestController @RequestMapping("/students") public class StudentControll…

    Java 2023年6月7日
    071
  • SQLyog连接MySQL8.0报2058错误的解决方法

    SQLyog连接MySQL8.0报2058错误的解决方法 原因: MySQL8.0密码的加密方法发生了改变 解决方法: 进入mysql执行以下语句 ALTER USER ‘root…

    Java 2023年6月5日
    063
  • Java基础巩固(二)——多线程

    Java基础巩固(二)——多线程 1.基本概念 程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个 静态的概念。 进程是执行程序的一次执行过程,它是一个 动态的概念。是系…

    Java 2023年6月7日
    066
  • springboot操作es

    转载:https://blog.csdn.net/qq_40018541/article/details/124839238?utm_medium=distribute.pc_re…

    Java 2023年5月30日
    075
  • MySQL十一:索引基本原理

    转载~ 在上一篇《索引基础知识回顾》中提到索引按照存储结构划分有B-Tree索引、Hash索引、B+Tree索引类型,接下来就学习一下这几种索引结构以及在实际存储引擎中的使用情况 …

    Java 2023年6月8日
    080
  • Java简介

    J2SE:平台标准版,可以做桌面程序开发 他是整个java技术的基础和核心 J2EE:平台企业版,可以做网站 J2ME:平台微型版,可以做移动端程序开发 简单性:舍弃了c++中难以…

    Java 2023年5月29日
    073
  • 机试相关链接收集

    机试题目: 教学类: Original: https://www.cnblogs.com/ticlab/p/16741717.htmlAuthor: ticlabTitle: 机试…

    Java 2023年6月7日
    072
  • 享元模式之网店模板

    1、 实例概况 在天猫商城里存在着成天上万的网店,但是天猫所提供的网站模板是一样的,存在许多天猫网店使用同一个网店模板的情况,如果每一个网店都用一个网店对象来表示,因为网店数量巨大…

    Java 2023年6月13日
    077
  • Java 17 新特性:switch的模式匹配(Preview)

    通过下面这个例子再回忆一下: Map data = new HashMap<>(); data.put("key1", "aaa&quot…

    Java 2023年6月9日
    070
  • Java学习 (20) Java数组篇(04)Arrays类&冒泡排序&稀疏数组

    Arrays类 语法实例 冒泡排序 语法实例 具体讲解视频(狂神说Java) 稀疏数组 语法实例 具体讲解视频(狂神说Java) Arrays类 教组的工具类java.util.A…

    Java 2023年6月8日
    0104
  • Java核心技术-反射、接口

    使用反射编写泛型数组 package cn.gyk; import java.lang.reflect.Array; /** * @author xg * @version V1….

    Java 2023年6月5日
    075
  • 抽象 类乐器 期末代码

    abstract class YueQi{ //表示发出声音的功能 public abstract void sound(); } //子类钢琴 class Piano exten…

    Java 2023年6月9日
    063
  • 160_SpringBoot案例-topic主题模式

    整体核心 目标 实现步骤 生产者 创建生产者工程:springboot-rabbitmq-topic-producer 在pom.xml中引入依赖 在application.yml…

    Java 2023年6月7日
    079
  • cmd导入导出Oracle数据库命令

    导入与导出,如下: 数据导出: exp 用户名/密码@网络服务名 file=xxx.dmp tables=(表名); eg:exp user/123456@10.83.200.17…

    Java 2023年6月5日
    085
  • 自定义MyBatis

    一. 原生 JDBC 1. 原生JDBC使用 public static void main(String[] args) { Connection conn = null; Pr…

    Java 2023年6月5日
    089
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球