4 - Channelhandler和ChannelPipeline
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的更多相关文章
- 【Netty】ChannelHandler和ChannelPipeline
一.前言 前面学习了Netty的ByteBuf,接着学习ChannelHandler和ChannelPipeline. 二.ChannelHandler和ChannelPipeline 2.1 Cha ...
- Netty实战六之ChannelHandler和ChannelPipeline
1.Channel的生命周期 Interface Channel定义了一组和ChannelInboundHandler API密切相关的简单但功能强大的状态模型,以下列出Channel的4个状态. C ...
- Netty 系列四(ChannelHandler 和 ChannelPipeline).
一.概念 先来整体的介绍一下这篇博文要介绍的几个概念(Channel.ChannelHandler.ChannelPipeline.ChannelHandlerContext.ChannelPromi ...
- netty中的ChannelHandler和ChannelPipeline
netty中的ChannelHandler和ChannelPipeline ChannelHandler 家族 https://www.w3cschool.cn/essential_netty_in_ ...
- Netty的ChannelHandler,ChannelHandlerContext,ChannelPipeline
本小节一起学习一下ChannelHandler,ChannelHandlerContext,ChannelPipeline这三个Netty常用的组件,不探究它们的底层源码,我们就简单的分析一下用法 首 ...
- ChannelHandler,ChannelHandlerContext,ChannelPipeline
本小节一起学习一下ChannelHandler,ChannelHandlerContext,ChannelPipeline这三个Netty常用的组件,不探究它们的底层源码,我们就简单的分析一下用法 首 ...
- Netty学习笔记(番外篇) - ChannelHandler、ChannelPipeline和ChannelHandlerContext的联系
这一篇是 ChannelHandler 和 ChannelPipeline 的番外篇,主要从源码的角度来学习 ChannelHandler.ChannelHandler 和 ChannelPipeli ...
- Netty 框架学习 —— ChannelHandler 与 ChannelPipeline
ChannelHandler 1. Channel 生命周期 Channel 的生命周期状态如下: 状态 描述 ChannelUnregistered Channel 已经被创建,但还未注册到 Eve ...
- Netty学习摘记 —— 再谈ChannelHandler和ChannelPipeline
本文参考 本篇文章是对<Netty In Action>一书第六章"ChannelHandler和ChannelPipeline",主要内容为ChannelHandle ...
随机推荐
- 关于系统中:/dev/mem
1)参考:https://blog.csdn.net/lsn946803746/article/details/52948036 博主:lsn946803746 2)参考:https://blog ...
- Elasticsearch之curl创建索引库
关于curl的介绍,请移步 Elasticsearch学习概念之curl 启动es,请移步 Elasticsearch的前后台运行与停止(tar包方式) Elasticsearch的前后台运行与停止( ...
- AngularJs(Part 8)--Filters
Filters AngularJS provides fileters to transfrom data from one kind to another . For example: {{ ...
- Ubuntu W: GPG 错误:下列签名无效: BADSIG 84DBCE2DCEC45805 Launchpad PPA fo
Ubuntu12.04 安装R语言的时候出现的报错. 研究了两个晚上,解决办法如下,跟参考贴有点出入: ############################################### ...
- 第5季-小试牛刀-项目开发\阶段2-新手上路\项目-移动物体监控系统\Sprint0-产品设计与规划
lesson1---产品功能展示 先完成准备阶段,准备阶段要做的事情: a.项目经理选择团队, b.根据项目用户需求以及同类型的实物,制定产品功能列表 c.根据功能的难易程度,制定迭代周期以及在每周期 ...
- 17.[CVE-2017-12615]Tomcat任意文件上传漏洞
[CVE-2017-12615] Tomcat任意文件上传漏洞 首先先贴出wooyun上的一个案例:http://wooyun.jozxing.cc/static/bugs/wooyun-2015-0 ...
- Python短小精悍的Orator基本使用技巧
基本使用 配置 设置数据库配置参数,创建一个DatabaseManager实例. from orator import DatabaseManager config = { 'mysql': { 'd ...
- Hadoop WordCount单词计数原理
计算文件中出现每个单词的频数 输入结果按照字母顺序进行排序 编写WordCount.java 包含Mapper类和Reducer类 编译WordCount.java javac -classpath ...
- 2017-10-23 NOIP模拟赛
叉叉 题目描述 现在有一个字符串,每个字母出现的次数均为偶数.接下来我们把第一次出现的字母a和第二次出现的a连一条线,第三次出现的和四次出现的字母a连一条线,第五次出现的和六次出现的字母a连一条线.. ...
- linux下oracle一些常用命令
dbca 配置数据库netca 配置tnslsnrctl status tns状态lsnrctl stop TNS停止lsnrctl start TNS启动