4.1 Channelhandler

4.1.1 Channel声明周期(状态事件)

方法 描述
ChannelUnregistered Channnel已创建,但是未注册到EventLoop
ChannelRegistered Channnel已注册到EventLoop
ChannelActive Channnel活动状态(已连接到远程节点),可以发送接收数据
ChannelInactive Channnel未连接到远程站点

4.1.2 Channelhandler生命周期(状态事件)

从channelPipeLine中添加删除时触发

方法 描述
handlerAdded 当把handler添加到channelPipieLine中时
handlerRemoved 从pipeLine中移除时
exceptionCaught handler处理过程中异常时调用

4.1.3 ChannelInBoundHandler接口--入站数据及状态变化

ChannelInBoundHandlerAdapter--调用read后如果不继续调用ctx.fireChannelRead(msg)将消息传给下一个channel(即丢弃消息),则需要手动释放(ReferenceCountutil.release(msg))

SimpleChannelInBoundHandler -- 已封装,自动释放资源

方法 描述
channelRead 从channel中读取数据时
channelReadComplete 所有数据都已从Channel中读取之后调用(可能之前channelRead已多次调用)
userEventTriggered 当ChannelInBoundHandler.fireuserEventTriggered()被调用时触发

4.1.3 ChannelOutBoundHandler 接口--出站数据及拦截操作

a). 可按需推迟操作或者事件.

b). 方法被channel、channelPipeLine及channelHandlerContext调用

方法 描述
bind
connect
disconnect
close
deregister
read(ChannelhandlerContext) 当请求从channel读取数据时调用
flush 写数据到远端
write write后不传递消息时需要手动释放,ReferenceCountutil.release(msg);promise.setSuccess();

4.2 ChannelPipeLine-channelhandler实例链

a). 可动态修改

b). fireChannelread之类方法都是调用ChannelPipeLine中下一个handler中对应方法.

方法 描述
addFist
addBefore
addAfter
addlast
remove
replace 以上都是处理内部channelHandler的方法

4.3 ChannelHandlerContext接口-handler和pipeLine之间的连接

4.4 异常处理

4.4.1 入站异常

a). 异常从出发的那一点开始流经pipiLine

b). exceptionCaught默认实现是将异常转发下一个handler处理

c). 如果到达尾部还未处理则被记录为未处理

public class EchoClientHandler extends SimpleChannelInboundHandler<ByteBuf>{
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause){
cause.printStackTrace();
ctx.close();
}
}

4.4.2 出站异常

a). 每个出站操作都返回一个ChannelFuture

public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise){
promise.addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture future) throws Exception {
if( !future.isSuccess() ){
future.cause().printStackTrace();
future.channel().close();
}
}
})
}

4 - Channelhandler和ChannelPipeline的更多相关文章

  1. 【Netty】ChannelHandler和ChannelPipeline

    一.前言 前面学习了Netty的ByteBuf,接着学习ChannelHandler和ChannelPipeline. 二.ChannelHandler和ChannelPipeline 2.1 Cha ...

  2. Netty实战六之ChannelHandler和ChannelPipeline

    1.Channel的生命周期 Interface Channel定义了一组和ChannelInboundHandler API密切相关的简单但功能强大的状态模型,以下列出Channel的4个状态. C ...

  3. Netty 系列四(ChannelHandler 和 ChannelPipeline).

    一.概念 先来整体的介绍一下这篇博文要介绍的几个概念(Channel.ChannelHandler.ChannelPipeline.ChannelHandlerContext.ChannelPromi ...

  4. netty中的ChannelHandler和ChannelPipeline

    netty中的ChannelHandler和ChannelPipeline ChannelHandler 家族 https://www.w3cschool.cn/essential_netty_in_ ...

  5. Netty的ChannelHandler,ChannelHandlerContext,ChannelPipeline

    本小节一起学习一下ChannelHandler,ChannelHandlerContext,ChannelPipeline这三个Netty常用的组件,不探究它们的底层源码,我们就简单的分析一下用法 首 ...

  6. ChannelHandler,ChannelHandlerContext,ChannelPipeline

    本小节一起学习一下ChannelHandler,ChannelHandlerContext,ChannelPipeline这三个Netty常用的组件,不探究它们的底层源码,我们就简单的分析一下用法 首 ...

  7. Netty学习笔记(番外篇) - ChannelHandler、ChannelPipeline和ChannelHandlerContext的联系

    这一篇是 ChannelHandler 和 ChannelPipeline 的番外篇,主要从源码的角度来学习 ChannelHandler.ChannelHandler 和 ChannelPipeli ...

  8. Netty 框架学习 —— ChannelHandler 与 ChannelPipeline

    ChannelHandler 1. Channel 生命周期 Channel 的生命周期状态如下: 状态 描述 ChannelUnregistered Channel 已经被创建,但还未注册到 Eve ...

  9. Netty学习摘记 —— 再谈ChannelHandler和ChannelPipeline

    本文参考 本篇文章是对<Netty In Action>一书第六章"ChannelHandler和ChannelPipeline",主要内容为ChannelHandle ...

随机推荐

  1. 资料:MVC框架+SQL Server 数据集成引擎

    ylbtech-资料:MVC框架+SQL Server 数据集成引擎 1.返回顶部 1. 功能特点: MVC框架耦合性低视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码,同样 ...

  2. Elasticsearch之curl创建索引库

    关于curl的介绍,请移步 Elasticsearch学习概念之curl 启动es,请移步 Elasticsearch的前后台运行与停止(tar包方式) Elasticsearch的前后台运行与停止( ...

  3. [#413c] Fountains

    http://codeforces.com/contest/799/problem/C 解题关键:树状数组取最大值,注意先搜索,后加入,此种情况可以取出最大值. 为什么可以取到最大值? 1.当分别用两 ...

  4. C++经典题目:有n个整数,使前面各数顺序向后移动m个位置

    问题描述: 有n个整数,使前面各数顺序向后移动m个位置,最后m个数变成最前m个数. 程序代码: #include<iostream> #define MAXLEN 200 using na ...

  5. Centos6.8下yum安装python2.7

    下载 ius-release.rpm包 wget https://centos6.iuscommunity.org/ius-release.rpm 安装ius-release.rpm包 rpm -Uv ...

  6. 6.7 通过命令启动IDEA,给IDEA创建快捷方式

    我的IDEA安装在这里: 打开终端: 这里的./表示当前路径.如果是/表示根目录. 通过这个命令行,就可以开启IDEA了. 接下来,给IDEA创建快捷方式. 工具栏Tools->create d ...

  7. Git merge一个branch到另一个branch

    在项目开发过程中,需要merge一个branch (branch名 taskBranch) 到另一个名为develop 的branch 方法: 先保证当前停留在develop的branch上 然后执行 ...

  8. oracle环境变量

    1---此部分引自http://hi.baidu.com/jason_xux/item/1f44681d356927fa756a8480  感谢 ORA_NLS33 环境变量ora_nls33定义'l ...

  9. 关于mysql查询最近一条记录

    关于mysql查询最近一条记录 最近项目中遇到需要查询记录当前时间最近的一条记录的问题,开始感觉无从下手,后来逐步发现了三种解决方案. 下策——查询出结果后将时间排序后取第一条 select * fr ...

  10. uboot——详解各目录下的文件作用

    uboot下载地址:http://ftp.denx.de/pub/u-boot/ 1.目录分布 2.目录结构变化: u-boot-2010.03及以前版本 ├── api                ...