美文网首页
netty之ChannelHandlerMask

netty之ChannelHandlerMask

作者: hello_kd | 来源:发表于2020-03-08 20:25 被阅读0次

ChannelHandlerMask主要是定义了ChannelHandler支持回调的事件类型以及相应的辅助方法。

类中定义了很多常量,每个常量表示支持一种回调的事件类型(比如handlerAdded、handlerRemoved等)。简单的说,每个常量指的就是handler的某个(或者某些)回调方法。定义如下

//发生异常回调
static final int MASK_EXCEPTION_CAUGHT = 1;
//channel注册到eventLoop中
static final int MASK_CHANNEL_REGISTERED = 1 << 1;
//channel解除注册
static final int MASK_CHANNEL_UNREGISTERED = 1 << 2;
static final int MASK_CHANNEL_ACTIVE = 1 << 3;
static final int MASK_CHANNEL_INACTIVE = 1 << 4;
static final int MASK_CHANNEL_READ = 1 << 5;
static final int MASK_CHANNEL_READ_COMPLETE = 1 << 6;
......等等,其他的就不列举出来了。

//默认入站处理器的executeMask值支持的回调
private static final int MASK_ALL_INBOUND = MASK_EXCEPTION_CAUGHT | MASK_CHANNEL_REGISTERED |
        MASK_CHANNEL_UNREGISTERED | MASK_CHANNEL_ACTIVE | MASK_CHANNEL_INACTIVE | MASK_CHANNEL_READ |
        MASK_CHANNEL_READ_COMPLETE | MASK_USER_EVENT_TRIGGERED | MASK_CHANNEL_WRITABILITY_CHANGED;

//默认出站处理器的executeMask值支持的回调。
private static final int MASK_ALL_OUTBOUND = MASK_EXCEPTION_CAUGHT | MASK_BIND | MASK_CONNECT | MASK_DISCONNECT |
        MASK_CLOSE | MASK_DEREGISTER | MASK_READ | MASK_WRITE | MASK_FLUSH;

每个ChannelHandler关联的ChannelHandlerContext中会有executeMask值,表示context关联的handler对象支持回调的事件类型,默认情况下,ChannelInboundHandler和ChannelOutboundHandler支持上述MASK_ALL_INBOUND和MASK_ALL_OUTBOUND所表示的事件。

ChannelHandlerMask类中的属性MASKS维护着每个handler的Class对象对应的executeMask值。因此在程序中,就可以根据一个handler获取其mask值,从而知道其支持的事件类型,并间接的知道这个handler属于inbound handler还是属于outbound handler。

那么,假如要使handler的某个回调方法不支持回调的话,只要在这个方法的声明上添加@Skip的注解,但是Skip的注解声明的公开性是默认包的,因此应用程序无法直接访问到。

不过netty已经提供的一些handler子类如ChannelHandlerAdapter,有的回调方法就用@Skip注解了,那么假如应用程序不重写该回调方法的话,而是直接继承自adapter,那么该回调方法对应的类型事件发生时,该方法就得不到回调了,因此一般子类需要重写。

需要注意的是,假如channel上某个事件发生时,希望通过关联的pipeline,将事件传递给每个handler,从而触发handler相应的回调方法,那么一定不能将该类型对应的回调方法加上注解@Skip

ChannelHandlerMask类中,提供了一个方法静态方法可以直接根据根据某个Handler对应的Class对象获取一个mask值

static int mask(Class<? extends ChannelHandler> clazz)

那么,在上文中提到了,根据mask值,就可以推断出这个handler支持的事件类型,这是如何做到的呢?只需要将mask值与ChannelHandlerMask定义好的常量值进行与(&)运算,若结果不等于0,那就说明handler支持这个常量所表示类型的事件触发回调。

上述只是在阅读netty源码时,若有理解错误的地方,烦请指出,谢谢。

相关文章

网友评论

      本文标题:netty之ChannelHandlerMask

      本文链接:https://www.haomeiwen.com/subject/ywrjdhtx.html