ChannelHandler和ChannelPipeline

76 阅读2分钟

前言

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