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 版权协议,转载请附上原文出处链接和本声明。