ChannelHandler
我们知道 Netty使用了异步的事件驱动模型,来触发网络I/O的各种操作。
所以对于channel通道的事件处理必须有一定的了解。
从字面上看,channelHandler:通道处理器,拥有着对channel不同状态的事件处理。
- 生命周期
- handlerAdded 将channelHandler添加到channelPipeline中时被调用
- handlerRemoved 将channelHandler从channelPipeline移除时被调用
- exceptionCaught 在整个channelPipeline中发生异常时被调用
现在我们不难看出channelPipeline 管理着channelHandler群。
类图
这里我们能看到两个很重要的处理器:入站处理器和出站处理器。
那何为入站何为出站:远离自身节点的操作称为出站,反之入站。
ChannelInboundHandler 入站处理器
netty内部提供了ChannelInboundHandlerAdapter 适配类实现入站处理器并且处理器适配器(类图中的ChannelHandlerAdapter )。实现了入站处理器的所有方法,目的是将消息转发到ChannelPipeline的下一个ChannelHandler。
(这里面要通过ChannelHandlerContext 上下文,简介:当ChannelHandler添加到ChannelPipeline时,会创建一个ChannelHandlerContext上下文,管理着与其他ChannelHandler的交互)
但是重写ChannelInboundHandlerAdapter 的channelRead方法时需要手动的释放已读的消息。ReferenceCountUtil.release(msg)。
所以可以使用simpleChannelInboundHandler,它会自动释放。ChannelOutboundHandler 出站处理器
ChannelOutboundHandler 的强大功能是可以按需推迟操作或者事件。例如,如果远程节点的写入被暂停是,你可以推迟冲刷操作并在稍后继续。它也拥有着自己的适配器类ChannelOutboundHandlerAdapter。
也实现了ChannelOutboundHandler的所有功能,同样通过上下文传递到下一个处理器。接下来我们说说在出站处理器中两个比较重要的变量:
ChannelPromise和ChannelFuture。
在出站处理器的大部分方法中都要ChannelPromise参数,它是ChannelFuture的一个子类,表示着操作通知,它拥有这setSuccess()和setFailure(),承载着异步操作的结果。ChannelHandlerAdapter 适配器类
提供着对入站处理器接口或出站处理器的所有实现。
以上只是我个人理解,仅供参考,如有错误,请包涵指正!