• 【Netty学习】 ChannelHandler 改动及影响


    channelHandler 在Netty 4.x版本有了相当大的改动

    http://netty.io/wiki/new-and-noteworthy.html   官网的更新改进说明。

    以下节选官网更新说明的部分中文翻译:

    在3.x时代,所有的I/O操作都会创建一个新的ChannelEvent对象。对每个读或写的操作,还会额外创建一个新的ChannelBuffer对象。由于将资源管理和buffer的池化交给了JVM,这实际上极大地简化了Netty的内部实现。但是,基于Netty开发的应用在高负载下运行时,有时会观察到GC(Garbage Collection)的压力增大或变化不定,这些问题的根源也来自于这里。

    4.0通过把事件对象替换为直接与类型相对应(译者注:原文为strongly typed,但是我觉得直译为强类型不太容易理解)的方法调用,几乎完全避免了事件对象的创建。3.x中,有类似于handleUpstream()和handleDownstream()这种能够捕获所有相关类型事件的处理器方法,4.0中你将不会再看到它们的身影了。所有的事件类型现在都有各自对应的处理器方法:

    ”所有这些变化意味着用户无法去扩展ChannelEvent这个已经不存在的接口了。那用户要怎样才能定义他或她自己的事件类型呢,就像IdleStateEvent?4.0中的ChannelHandler有一个处理器方法叫做userEventTriggered(),它就是被设计用来满足这种特殊的用户需求。

    4.x版本中简化了channel 状态模型(Simplified channel state model):

    3.x版本的:

    在4.x版本中:

    ChannelOpen ChannelBound 和ChannelConnected 合并到ChannelActive.ChannelDisconnected ChannelUnbound ChannlClosed合并到ChannelInactive中

    如下图所示:

    在Netty4.0.12的源代码中我们可以看到AbstractChannel中的:

    AbstractUnsafe{

    ...//调用fireChannelActive()

    private void register0(ChannelPromise promise)

    public final void bind(final SocketAddress localAddress, final ChannelPromise promise)

    ...//调用fireChannelInactive()

    public final void disconnect(final ChannelPromise promise)

    public final void close(final ChannelPromise promise)

    }

    ..值得注意的是官网还特意提示了ChannelRegister和ChannelOpen和ChannelClosed有很大的区别

    引入翻译:"channelRegistered和channelUnregistered这两个事件与channelOpen和channelClosed具有的意义是不一样的。它们(channelRegistered和channelUnregistered)是在支持Channel的动态注册、注销以及再注册时被引入的"

    如图所示。注册和注销仅仅用于每次的操作。

    以下是个人口水:

    貌似这么做的好处在于。把channel的异常放在一个方法内统一处理。在3.x的开发过程中发现。很多时候我们想要的只是一个结果。服务端数据在客户端channel断开连接。解绑定。关闭3中状态时,需要将相对应的信息数据处理掉。在4.x版本中将这三个事件整合之后。只需要统一的处理就好了。

     1 // 管道从不活跃状态  转到  活跃状态 触发
     2 @Override
     3     public void channelActive(ChannelHandlerContext ctx) throws Exception {
     4         final Channel channel = ctx.channel();
     5         if(channel.isOpen()){
     6     // 管道 活跃的  并且是开启状态
     7         }
     8         super.channelActive(ctx);
     9     }
    10 
    11 // 管道从活跃状态  转到  不活跃状态 触发
    12     @Override
    13     public void channelInactive(ChannelHandlerContext ctx) throws Exception {
    14 
    15         Channel channel = ctx.channel();
    16         if(!channel.isOpen()){
    17             
    18             
    19         }
    20         super.channelInactive(ctx);
    21     }
    View Code
  • 相关阅读:
    aix lvm_lv_vg
    Centos6.5 telnet wireshark
    Qt开发初步,循序渐进,preRequest for 蓝图逆袭
    CentOs文件实时同步
    Qt GUI开发实战初期
    linux环境开发私房菜
    linux GUI程序开发
    Centos6.5 Qt4开发 Cannot find -lGL QApplication not file or dir
    Centos6.5升级gcc for qt5.3.1
    对Socket CAN的理解(5)——【Socket CAN控制器的初始化过程】
  • 原文地址:https://www.cnblogs.com/zou90512/p/3421478.html
Copyright © 2020-2023  润新知