4 - Channelhandler和ChannelPipeline
2024-09-28 17:55:31
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();
}
}
})
}
最新文章
- Sublime Text 3 支持的热门插件推荐
- 浅析jquery ajax异步调用方法中不能给全局变量赋值的原因及解决方法(转载)
- 提高Oracle的WHERE语句性能一些原则
- mybatis There is no getter for property named &#39;xx&#39; in &#39;class java.lang.String
- SQL 数据类型、约束、索引及视图
- Can&#39;t load IA 32-bit .dll on a AMD 64-bit platform
- MySQL 通配符学习总结
- iOS:删除小程序
- java中什么样的对象能够进入老年代
- 对N各集合中的任意元素进行排列组合问题
- mysql各种引擎对比、实战
- 贪心算法----区间选点问题(POJ1201)
- Linux下Redis服务器搭建
- 在文件保存中 os.getcwd() os.listdir() os.makedirs() os.mkdir() xx.join() ... 等函数 的使用介绍
- go 多维度 Map 的数据存取
- Go语言栈定义及相关方法实现
- 百度前端代码规范:CSS
- Programming 2D Games 读书笔记(第二章)
- Windows TCP/IP 临时、保留和封锁端口行为
- 一个使用Servlet文件实现文件下载的实例