接上篇,我们继续进入AbstractBootstrap类的 initAndRegister() 方法

进入init()方法

设置父级Channel的options,

进入到上节提到的NioServerSocketChannelConfig

其实就是为我们的channel.config()设置全局属性,当然我们也可以设置attr。

继续看,从channel中获取新创建的pipeline,获取我们初始化的childOptions和childAttrs,我们这里都是null,因为我们并未通过引导器ServerBootStrap来设置。

然后调用了pipeline的addLast方法,传入了一个抽象方法的实现类,这个类就是当前的此类,ServerBootstrap, 这里要注意

继续代码跟进去,我们debug看一下

继续跟

进入 newCtx = newContext(group, name, handler);

我们看,这里childExecutor由于传入的事件循环组是null,所以childExecutor(group)的返回时null, 并且 new 了一个 DefaultChannelHandlerContext 。

进入构造方法

将ServerBootstrap 赋给成员变量 handler , isInboud(handler) 和 isOutbound(handler) 是用来判断是入站处理器还是出站处理器

确认一下,看到ServerBootstrap 继承的这类 ChannelInitializer 继承了 入站处理器的适配器, 也就是  isInboud(handler) = true  , isOutbound(handler)  = false

继续进去父类的构造方法 ,赋值成员变量, 这个时候executor 是 null, 也就是说这里还没有指定当前的这个channel 以后由那个线程来处理

总结一下就是创建了一个上下文包裹了这个ServerBootstrap

我们继续往下看:

把刚刚创建的这个上下文 添加到 pipeline的列表中

现在就变成了这样的层级关系 HeadContext -> ServerBootstrap -> TailContext

看到这里大家或许会有一些疑问,为什么把ServerBootstrap添加到链表中?而不是我们最开始的那个LoggingHandler呢?

其实

这里只是添加一个抽象方法的实现类进去,并没有真正调用initChannel的方法,这个要注意,这个在后面channel注册完后会来调用,并且会把我们当前添加的这个ServerBootstrap从链表中移除掉,这个我们后面再说。

同时值得注意的是,这里还初始化了一个ServerBootstrapAcceptor类,没错这个就是acceptor, 用来接收客户端连接并且将新的客户端注册到多路复用器上,便于处理后面的读写操作。

Netty源码分析--初始化Options,添加处理器(四)的更多相关文章

  1. Netty源码分析第2章(NioEventLoop)---->第4节: NioEventLoop线程的启动

    Netty源码分析第二章: NioEventLoop   第四节: NioEventLoop线程的启动 之前的小节我们学习了NioEventLoop的创建以及线程分配器的初始化, 那么NioEvent ...

  2. Netty源码分析第1章(Netty启动流程)---->第3节: 服务端channel初始化

    Netty源码分析第一章:Netty启动流程   第三节:服务端channel初始化 回顾上一小节的initAndRegister()方法: final ChannelFuture initAndRe ...

  3. Netty源码分析第3章(客户端接入流程)---->第1节: 初始化NioSockectChannelConfig

    Netty源码分析第三章: 客户端接入流程 概述: 之前的章节学习了server启动以及eventLoop相关的逻辑, eventLoop轮询到客户端接入事件之后是如何处理的?这一章我们循序渐进, 带 ...

  4. Netty源码分析第4章(pipeline)---->第2节: handler的添加

    Netty源码分析第四章: pipeline 第二节: Handler的添加 添加handler, 我们以用户代码为例进行剖析: .childHandler(new ChannelInitialize ...

  5. Netty源码分析第1章(Netty启动流程)---->第1节: 服务端初始化

    Netty源码分析第一章:  Server启动流程 概述: 本章主要讲解server启动的关键步骤, 读者只需要了解server启动的大概逻辑, 知道关键的步骤在哪个类执行即可, 并不需要了解每一步的 ...

  6. Netty源码分析第2章(NioEventLoop)---->第3节: 初始化线程选择器

    Netty源码分析第二章:NioEventLoop   第三节:初始化线程选择器 回到上一小节的MultithreadEventExecutorGroup类的构造方法: protected Multi ...

  7. Netty源码分析 (三)----- 服务端启动源码分析

    本文接着前两篇文章来讲,主要讲服务端类剩下的部分,我们还是来先看看服务端的代码 /** * Created by chenhao on 2019/9/4. */ public final class ...

  8. Netty源码分析第4章(pipeline)---->第1节: pipeline的创建

    Netty源码分析第四章: pipeline 概述: pipeline, 顾名思义, 就是管道的意思, 在netty中, 事件在pipeline中传输, 用户可以中断事件, 添加自己的事件处理逻辑, ...

  9. Netty源码分析第4章(pipeline)---->第7节: 前章节内容回顾

    Netty源码分析第四章: pipeline 第七节: 前章节内容回顾 我们在第一章和第三章中, 遗留了很多有关事件传输的相关逻辑, 这里带大家一一回顾 首先看两个问题: 1.在客户端接入的时候, N ...

随机推荐

  1. Socket实现原理和机制

    要写网络程序就必须用Socket,这是程序员都知道的.而且,面试的时候,我们也会问对方会不会Socket编程?一般来说,很多人都会说,Socket编程基本就是listen,accept以及send,w ...

  2. Disk array controller and information processing apparatus

    A disk array controller has a function of relocating a plurality of data blocks stored in a disk arr ...

  3. Xcode 4.5( iOS6 SDK)、旧版本号cocos2d,支持iPhone5解析度

    支持iPhone5全屏 1假设没有支持iPhone5是否.直接运行程序可以准备提交.开放iPhone5模拟器,你会发现上面有黑色的程序.没有矩形. 2真正运行该程序时,.你会发现程序回程屏幕高度.它是 ...

  4. hadoop学习笔记(四)——eclipse+maven+hadoop2.5.2源代码

    Eclipse同maven进口hadoop源代码 1)  安装和配置maven环境变量 M2_HOME: D:\profession\hadoop\apache-maven-3.3.3 PATH: % ...

  5. Openstack+Kubernetes+Docker微服务实践

    Openstack+Kubernetes+Docker微服务实践 .....   Openstack+Kubernetes+Docker微服务实践之路--选型 posted @ 2016-11-15 ...

  6. WPF透明窗体制作

    原文:WPF透明窗体制作 窗体的样式: <Grid Width="{Binding Width, ElementName=w}" Height="{Binding ...

  7. hdu3118Arbiter (使用二分图的定义,枚举每个状态)

    Arbiter Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total Sub ...

  8. Android blueZ HCI(一个):hciconfig实施和经常使用

    关键词:hciconfighcitool  hcidump笔者:xubin341719(欢迎转载,请明确说明,请尊重版权,谢谢.)欢迎指正错误,共同学习.共同进步! . Android blueZ H ...

  9. 两个同名controller导致调用崩溃

    之前遇到一个很诡异的bug,大概情况如下: 生成成功,运行正常,调试正常 但是调用目标controller的目标方法,运行自动中断,调试自动中断 没有任何明确的错误提示,包括调试都没有弹窗报错 调用其 ...

  10. spring boot的默认配置

    # BANNER banner.charset=UTF- # Banner file encoding. banner.location=classpath:banner.txt # Banner f ...