Netty的核心处理-ChannelHandler

Netty学习指北07

Posted by MistRay on September 26, 2019

Netty学习指北07

ChannelPipeline中将ChannelHandler链接在一起以组织处理逻辑.

Channel的生命周期

Interface Channel 定义了一组和ChannelInboundHandler API密切相关的简单且功能强大的状态模型.

状态 描述
ChannelUnregistered Channel已经被创建,但还未注册到EventLoop
ChannelRegistered Channel已经被注册到EventLoop
ChannelActive Channel处于活动状态(已经连接到它的远程节点).可以接受和发送数据了
ChannelInactive Channel没有连接到远程节点

Channel的生命周期

ChannelHandler的生命周期

ChannelHandler定义的生命周期操作,在ChannelHandler被添加到ChannelPipeline中或者被从ChannelPipeline中移除时会调用这些操作. 这些方法中每一个都接受一个ChannelHandlerContext参数.

类型 描述
handlerAdded 把当前ChannelHandler添加到ChannelPipeline中时被调用
handlerRemoved 当从ChannelPipeline中移除ChannelHandler时被调用
exceptionCaught 当处理过程中在ChannelPipeline中有错误产生的时候被调用

Netty定义了下面两个重要的ChannelHandler子接口: ChannelInboundHandler–处理入站数据以及各种状态变化; ChannelOutboundHandler–处理出站数据并且允许拦截所有操作.

ChannelInboundHandler

该接口的方法会在数据接收时或者与其对应的Channel状态发生改变时被调用.正如我们之前提到的,这些方法和Channel的生命周期密切相关.

ChannelInboundHandler中的方法

回调方法 触发时机
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调用.

ChannelOutboundHandler中的方法

回调方法 触发时机 客户端 服务端
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 适配器

你可以使用ChannelInboundHandlerAdapterChannelOutboundHandlerAdapter作为自己的ChannelHandler的起始点. 两个适配器分别提供了ChannelInboundHandlerChannelOutboundHandler的基本实现.通过扩展抽象类ChannelHandlerAdapter, 它们获得了它们共同的超接口ChannelHandler的方法. ChannelHandlerAdapter类的层次结构

Reference

转载

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