前言
netty 数据流和处理组件
ChannelPipeline 将ChannelHandler链接在一起以组织处理逻辑
Netty 组件模型
interface channel 定义了一组和ChannelInboundHandler Api密切相关的简单但功能强大的状态模型
Channel 状态:
- channel 已经被创建,但还未注册到EventLoop ChannelUnregistered
- channel 已经被注册到了EventLoop ChannelRegistered
- channel处于活动状态(已经连接到它的远程节点)。它可以接收和发送数据了 channelActive
- channel没有连接到远程节点 channelInactive
当这些状态发生改变时,将会生成对应的事件,这些事件会被转发给ChannelPipeline中的ChannelHandler。其可以随后对它们做出响应。
ChannelHandler定义了生命周期,在ChannelHandler被添加到ChannelPipeline中或被从ChannelPipeline中移除时会调用这些操作。
- 当把channelHandler添加到ChannelPipeline中时被调用 handlerAdded
- 当从ChannelPipeline中移除ChannelHandler时被调用 handlerRemoved
- 当处理过程中在ChannelPipeline中有错误产生时被调用 exceptionCaught
Netty定义了下面两个重要的ChannelHandler子接口:
ChannelInboundHandler 处理入站数据以及各种状态的变化
ChannelOutboundHandler 处理出站数据并允许拦截所有的操作
ChannelInboundHandler 方法
- channelRegistered 当channel以及注册到他的EventLoop并且能够处理IO时被调用
- channelUnRegistered 当Channel从它的EventLoop注销并且无法处理io时被调用
- channelActive 当channel处于活动状态时被调用
- channelInactive 当channel离开活动,不在连接远程节点时被调用
- channelReadComplete 当channel上一个读操作完成时被调用
- channelRead 当channel读取数据时被调用
- channelWritabilityChanged 当channel的可写状态发生改变时被调用,用户可以确保写操作不会完成得太快。
- userEventTriggered 当channelInboundhandler.fireUserEventTriggered()方法被调用时被调用,因为一个POJO被传经了ChannelPipeline
当某个ChannelHandler的实现重写channelRead方法时,它将负责显式地释放与池化ByteBuf实例相关的内存。
Netty提供了一个实用方法:ReferenceCountUtil.release();