《Netty学习》(四)ChannelHandler学习

来源:互联网 发布:redis数据存储在哪里 编辑:程序博客网 时间:2024/06/13 09:05

ChannelHandler

我们知道 Netty使用了异步的事件驱动模型,来触发网络I/O的各种操作。所以对于channel通道的事件处理必须有一定的了解。从字面上看,channelHandler:通道处理器,拥有着对channel不同状态的事件处理。
  • 生命周期
    • handlerAdded 将channelHandler添加到channelPipeline中时被调用
    • handlerRemoved 将channelHandler从channelPipeline移除时被调用
    • exceptionCaught 在整个channelPipeline中发生异常时被调用

现在我们不难看出channelPipeline 管理着channelHandler群。

  • 类图

    这里写图片描述

这里我们能看到两个很重要的处理器:入站处理器出站处理器
那何为入站何为出站:远离自身节点的操作称为出站,反之入站。

  • ChannelInboundHandler 入站处理器

    • 这里写图片描述

    netty内部提供了ChannelInboundHandlerAdapter 适配类实现入站处理器并且处理器适配器(类图中的ChannelHandlerAdapter )。实现了入站处理器的所有方法,目的是将消息转发到ChannelPipeline的下一个ChannelHandler。

    (这里面要通过ChannelHandlerContext 上下文,简介:当ChannelHandler添加到ChannelPipeline时,会创建一个ChannelHandlerContext上下文,管理着与其他ChannelHandler的交互)
    但是重写ChannelInboundHandlerAdapter 的channelRead方法时需要手动的释放已读的消息。ReferenceCountUtil.release(msg)。
    所以可以使用simpleChannelInboundHandler,它会自动释放。

  • ChannelOutboundHandler 出站处理器
    这里写图片描述
    ChannelOutboundHandler 的强大功能是可以按需推迟操作或者事件。例如,如果远程节点的写入被暂停是,你可以推迟冲刷操作并在稍后继续。它也拥有着自己的适配器类ChannelOutboundHandlerAdapter。
    也实现了ChannelOutboundHandler的所有功能,同样通过上下文传递到下一个处理器。

    接下来我们说说在出站处理器中两个比较重要的变量:
    ChannelPromiseChannelFuture
    在出站处理器的大部分方法中都要ChannelPromise参数,它是ChannelFuture的一个子类,表示着操作通知,它拥有这setSuccess()和setFailure(),承载着异步操作的结果。

  • ChannelHandlerAdapter 适配器类
    提供着对入站处理器接口或出站处理器的所有实现。

以上只是我个人理解,仅供参考,如有错误,请包涵指正!

原创粉丝点击