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 ...
随机推荐
- const关键字祥解
为什么使用const?采用符号常量写出的代码更容易维护:指针常常是边读边移动,而不是边写边移动:许多函数参数是只读不写的.const最常见用途是作为数组的界和switch分情况标号(也可以用枚举符代替 ...
- 查看,检查,修复pg的命令
标签(空格分隔): ceph,ceph运维,pg 如果集群状态是HEALTH_ERR 并且有pgs inconsistent,需要进行如下操作: 1. 通过下面的命令查看哪些pg状态不一致: # ce ...
- 一个有关Golang变量作用域的坑
转自:http://tonybai.com/2015/01/13/a-hole-about-variable-scope-in-golang/ 临近下班前编写和调试一段Golang代码,但运行结果始终 ...
- java基础知识(7)---多态
多 态:(面向对象特征之一):函数本身就具备多态性,某一种事物有不同的具体的体现.体现:父类引用或者接口的引用指向了自己的子类对象.//Animal a = new Cat();多态的好处:提高了程序 ...
- Spring整合JUnit4测试时,使用注解引入多个配置文件
转自:https://blog.csdn.net/pwh309315228/article/details/62226372 一般情况下: @ContextConfiguration(Location ...
- Mysql 数据库时间更新字段
关于时间更新: 创建时间: CURRENT_TIMESTAMP 更新时间: 勾选根据时间戳更新
- 调试opencv调用摄像头程序时碰到的问题
昨天晚上想把opencv学习笔记整理一下,当跑opencv调用摄像头的程序的时候老是出现Assertion failed (size.width>0 && size.height ...
- [凸包]Triangles
https://nanti.jisuanke.com/t/15429 题目大意:给出平面内$n$个整数坐标点,保证无三点共线.可以进行若干次连线,每次选择一个点对连接线段,但是任意两条线段都不得在给定 ...
- MySql获取记录的名次
在oracle中有rownum之类的东西表示记录的名次,那么在MySql中怎么获取名次呢? as rank ) B 获取的rank就是名次了 user_id rank 134762 122139 ...
- glib-2.40编译安装
1 安装glib库所需要的依赖库: libffi-.tar.gz glib-.tar.xz 安装依赖库libffi: tar xf libffi-.tar.gz cd libffi- ./config ...