Netty学习指北07
在ChannelPipeline中将ChannelHandler链接在一起以组织处理逻辑.
Channel的生命周期
Interface Channel 定义了一组和ChannelInboundHandler API密切相关的简单且功能强大的状态模型.
| 状态 | 描述 |
|---|---|
| ChannelUnregistered | Channel已经被创建,但还未注册到EventLoop |
| ChannelRegistered | Channel已经被注册到EventLoop |
| ChannelActive | Channel处于活动状态(已经连接到它的远程节点).可以接受和发送数据了 |
| ChannelInactive | Channel没有连接到远程节点 |

ChannelHandler的生命周期
ChannelHandler定义的生命周期操作,在ChannelHandler被添加到ChannelPipeline中或者被从ChannelPipeline中移除时会调用这些操作. 这些方法中每一个都接受一个ChannelHandlerContext参数.
| 类型 | 描述 |
|---|---|
| handlerAdded | 把当前ChannelHandler添加到ChannelPipeline中时被调用 |
| handlerRemoved | 当从ChannelPipeline中移除ChannelHandler时被调用 |
| exceptionCaught | 当处理过程中在ChannelPipeline中有错误产生的时候被调用 |
Netty定义了下面两个重要的ChannelHandler子接口:
ChannelInboundHandler–处理入站数据以及各种状态变化;
ChannelOutboundHandler–处理出站数据并且允许拦截所有操作.
ChannelInboundHandler
该接口的方法会在数据接收时或者与其对应的Channel状态发生改变时被调用.正如我们之前提到的,这些方法和Channel的生命周期密切相关.

| 回调方法 | 触发时机 |
|---|---|
| channelRegistered | 当前channel注册到EventLoop |
| channelUnregistered | 当前channel从EventLoop取消注册 |
| channelActive | 当前channel激活的时候 |
| channelInactive | 当前channel不活跃的时候,也就是当前channel到了它生命周期末 |
| channelRead | 当前channel从远端读取到数据 |
| channelReadComplete | channel read消费完读取的数据的时候被触发 |
| userEventTriggered | 用户事件触发的时候 |
| channelWritabilityChanged | channel的写状态变化的时候触发 |
由于每个方法都带了ChannelHandlerContext作为参数,具体作用是,在每个回调事件里面,处理完成之后,
使用ChannelHandlerContext的fireChannelXXX方法来传递给下个ChannelHandler,Netty的codec模块和业务处理代码分离就用到了这个链路处理.
使用实现了ChannelInboundHandler接口的抽象类SimpleChannelInboundHandler会自动释放资源.
所以你不应该存储指向任何消息的引用工供将来使用,因为这些引用都会失效.
ChannelOutboundHandler
出站操作和数据将由ChannelOutboundHandler处理.它的方法将被Channel,ChannelPipeline以及ChannelHandlerContext调用.

| 回调方法 | 触发时机 | 客户端 | 服务端 |
|---|---|---|---|
| bind | bind操作执行前触发 | false | true |
| connect | connect 操作执行前触发 | true | false |
| disconnect | disconnect 操作执行前触发 | true | false |
| close | close操作执行前触发 | false | true |
| deregister | deregister操作执行前触发 | ||
| read | read操作执行前触发 | true | true |
| write | write操作执行前触发 | true | true |
| flush | flush操作执行前触发 | true | true |
ChannelPromise与ChannelFuture ChannelOutboundHandler中大部分方法都需要一个ChannelPromise参数, 以便在操作完成时得到通知.ChannelPromise是ChannelFuture的一个子类.其定义了一些可写的方法,从而使ChannelFuture不可变.
ChannelHandler 适配器
你可以使用ChannelInboundHandlerAdapter和ChannelOutboundHandlerAdapter作为自己的ChannelHandler的起始点.
两个适配器分别提供了ChannelInboundHandler和ChannelOutboundHandler的基本实现.通过扩展抽象类ChannelHandlerAdapter,
它们获得了它们共同的超接口ChannelHandler的方法.

Reference
转载
本文遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。