高并发编程系列(七)Netty Handler底层原理源码详解

1 Handler的各种“姿势”

1.1 ChannelHandlerContext

每个ChannelHandler被添加到ChannelPipeline后,都会创建一个ChannelHandlerContext,并与ChannelHandler关联绑定。ChannelHandlerContext允许ChannelHandler与其他的ChannelHandler进行交互。ChannelHandlerContext不会改变添加到其中的ChannelHandler,因此它是安全的。ChannelHandlerContext、ChannelHandler和ChannelPipeline的关系如下图所示。

1.2 Channel的生命周期

Netty有一个简单但强大的状态模型,能完美映射到ChannelInboundHandler的各个方法。如下表所示是Channel生命周期中四个不同的状态。

一个Channel正常的生命周期如下图所示。随着状态发生变化产生相应的事件。这些事件被转发到ChannelPipeline中的ChannelHandler来触发相应的操作。

1.3 ChannelHandler常用的API

先看一下Netty中整个Handler体系的类关系图,如下图所示。

Netty定义了良好的类型层次结构来表示不同的处理程序类型,所有类型的父类是ChannelHandler。ChannelHandler提供了在其生命周期内添加或从ChannelPipeline中删除的方法,如下表所示。

Netty还提供了一个实现了ChannelHandler的抽象类ChannelHandlerAdapter。ChannelHandlerAdapter实现了父类的所有方法,主要功能就是将请求从一个ChannelHandler往下传递到下一个ChannelHandler,直到全部ChannelHandler传递完毕。也可以直接继承于ChannelHandlerAdapter,然后重写里面的方法。

1.4 ChannelInboundHandler

ChannelInboundHandler提供了一些在接收数据或Channel状态改变时被调用的方法。下面是ChannelInboundHandler的一些方法。

Netty提供了一个实现ChannelInboundHandler接口并继承ChannelHandlerAdapter的类:ChannelInboundHandlerAdapter。ChannelInboundHandlerAdapter实现了ChannelInboundHandler的所有方法,作用就是处理消息并将消息转发到ChannelPipeline中的下一个ChannelHandler。ChannelInboundHandlerAdapter的channelRead()方法处理完消息后不会自动释放消息,若想自动释放收到的消息,可以使用SimpleChannelInboundHandler。ChannelRead()方法的实现代码如下。

SimpleChannelInboundHandler会自动释放消息,代码如下。

ChannelInitializer主要用来提供给用户初始化ChannelHandler的入口,将自定义的各种ChannelHandler添加到ChannelPipe。

展开阅读全文

页面更新:2024-03-25

标签:都会   重写   底层   详解   生命周期   源码   原理   状态   消息   类型   事件   关系   代码   方法   系列

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top