pipeline有一个主要的实现类 DefaultChannelPipeline ,addLast顾名思义,就是在处理器链的最后添加一个channelHandler。

代码如下:@Override    public final ChannelPipeline addLast(EventExecutorGroup group, String name, ChannelHandler handler) {

final AbstractChannelHandlerContext newCtx;
        synchronized (this) {
            checkMultiplicity(handler);
------------用channelHandlerContext包装这个handler
            newCtx = newContext(group, filterName(name, handler), handler);
------------这个方法其实没啥,简单的添加到后头
            addLast0(newCtx);

            // 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) {---------------把ChannelHandlerContext中的handlerState这个volatile属性,从INIT状态设置成ADD_PENDING,意思是表明这个handler的状态从初始变成等待添加
                newCtx.setAddPending();
                callHandlerCallbackLater(newCtx, true);
                return this;
            }

            EventExecutor executor = newCtx.executor();
            if (!executor.inEventLoop()) {
                newCtx.setAddPending();--------------将任务添加到NioEventLoop的队列中,等待执行,异步?
                executor.execute(new Runnable() {
                    @Override
                    public void run() {--------------这个方法,其实有两个逻辑:第一,处理handler被添加到处理器链的时候,要做的准备工作,因为只有做完了这些准备工作,才能处理数据。第二,把HandlerContext的handlerState设置成ADD_COMPLETE,不过,异步完成,会不会逻辑有问题?或者在channel开始处理数据之前,会检查判断?在注册之后会有一个invokeHandlerAddedIfNeeded,执行所有放入队列的相关任务。--------------handlerAdded这个名字的意思并不是添加handler,添加handler这个步骤在addlast0里做过了,而是让handler做被添加之后的准备工作--------------handlerContext的fire/invoke channelRegistered/active/inactive/unregister/read 都是handlerContext对channel时间的相应,比如channel被生成,初始化了,他所属的handler要被add,然后执行handleradded方法,为channel的处理做准备,接下来,channel被registered了,又要用context执行channelRegistered方法,这些逻辑其实有的都是重复的,都是为了channel的工作做准备。
                        callHandlerAdded0(newCtx);
                    }
                });
                return this;
            }
        }
        callHandlerAdded0(newCtx);
        return this;
    }

netty pipeline.addLast的更多相关文章

  1. 关于Netty Pipeline中Handler的执行顺序问题

    原文地址:http://blog.csdn.net/wgyvip/article/details/25637651 最近在学习Netty框架,根据官网的教程学着做了几个小测试,都成功了,后面开始试着写 ...

  2. Netty Pipeline与ChannelHandler那些事

    Pipeline和ChannelHandler是Netty处理流程的重要组成部分,ChannelHandler对应一个个业务处理器,Pipeline则是负责将各个ChannelHandler串起来的& ...

  3. Netty Pipeline、channel、Context之间的数据流向

    以下所绘制图形均基于Netty4.0.28版本. 一.connect(outbound类型事件)  当用户调用channel的connect时,会发起一个outbound类型的事件,该事件将在pipe ...

  4. 【netty】(2)---搭建一个简单服务器

    netty(2)---搭建一个简单服务器 说明:本篇博客是基于学习慕课网有关视频教学.效果:当用户访问:localhost:8088 后 服务器返回 "hello netty"; ...

  5. 网络编程 -- RPC实现原理 -- Netty -- 迭代版本V3 -- 编码解码

    网络编程 -- RPC实现原理 -- 目录 啦啦啦 V2——Netty -- pipeline.addLast(io.netty.handler.codec.MessageToMessageCodec ...

  6. 第3章_Java仿微信全栈高性能后台+移动客户端

    当服务器构建完毕并且启动之后,我们通过网页URL地址就可以访问这台服务器,并且服务器会向网页输出Hello Netty这样几个字. Netty有三种线程模型:单线程.多线程.主从线程.Netty官方推 ...

  7. Netty 核心组件 Pipeline 源码分析(一)之剖析 pipeline 三巨头

    目录大纲: 前言 ChannelPipeline | ChannelHandler | ChannelHandlerContext 三巨头介绍 三巨头编织过程(创建过程) ChannelPipelin ...

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

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

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

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

随机推荐

  1. LeetCode--405--数字转化为十六进制数

    问题描述: 给定一个整数,编写一个算法将这个数转换为十六进制数.对于负整数,我们通常使用 补码运算 方法. 注意: 十六进制中所有字母(a-f)都必须是小写. 十六进制字符串中不能包含多余的前导零.如 ...

  2. p1474 Money Systems

    就是背包,用O(n*m)的一维. #include <iostream> #include <cstdio> #include <cmath> #include & ...

  3. python安装pandas和lxml

    一.安装python 二.安装pip 三.安装mysql-connector(window版):下载mysql-connector-python-2.1.3,解压后进入目录,命令安装:pip inst ...

  4. Binary Gap(二进制空白)

    中文标题[二进制空白] 英文描述 A binary gap within a positive integer N is any maximal sequence of consecutive zer ...

  5. python2.7 目录下没有scripts

    1.python2.7 配置环境完成或,python目录下没有scripts目录,先下载setuptools,cmd下载该目录下,输入python setup.py install 2.完成后,pyt ...

  6. Python基础之模块以及5大模块的使用

    内容梗概: 1. 模块的简单认识 2. collections模块 3. time时间模块 4. random模块 5. os模块 6. sys模块 1.模块的简单认识定义:模块就是我们把装有特定功能 ...

  7. java 字符串截取的几种方式(转)

    众所周知,java提供了很多字符串截取的方式.下面就来看看大致有几种. 1.split()+正则表达式来进行截取. 将正则传入split().返回的是一个字符串数组类型.不过通过这种方式截取会有很大的 ...

  8. LeetCode 958. 二叉树的完全性检验

    958. 二叉树的完全性检验  显示英文描述 我的提交返回竞赛   用户通过次数119 用户尝试次数157 通过次数123 提交次数378 题目难度Medium 给定一个二叉树,确定它是否是一个完全二 ...

  9. JavaScript 上万条数据 导出Excel文件(改装版)

    最近项目要js实现将数据导出excel文件,网上很多插件实现~~那个开心呀,谁知道后面数据量达到上万条时出问题:浏览器不仅卡死,导出的excel文件一直提示网络失败.... debug调试发现var  ...

  10. rexec/rlogin/rsh介绍

    服务 是否需要密码 是否明文 功能 端口 rexec 是 是 远程执行命令 512 rlogin 是 是 远程登录得到shell 513 rsh 是 是 可远程执行命令,也可远程登录得到shell 5 ...