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();
}
}
})
}

最新文章

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

热门文章

  1. MVC4.0 里的分析器错误
  2. 相关符号标点的英文(IOS学习)
  3. TCP/IP的3次握手和4次握手
  4. Ubuntu 安装Logstash
  5. JavaScript正则表达式应用---replace()
  6. ant安装和配置
  7. Django 之 JsonResponse 对象
  8. redis集群搭建踩坑笔记
  9. 第一章 –– Java基础语法
  10. 浅谈JavaScript--事件委托与事件监听