• 6 channelHandler和ChannelPipeline


    6.1.1 Channel 的生命周期

     

    Channel 的正常生命周期如图6-1 所示。当这些状态发生改变时,将会生成对应的事件。

    这些事件将会被转发给ChannelPipeline 中的ChannelHandler,其可以随后对它们做出

    响应。

    由于SimpleChannelInboundHandler 会自动释放资源,所以你不应该存储指向任何消

    息的引用供将来使用,因为这些引用都将会失效。

     

    每当通过调用ChannelInboundHandler.channelRead()或者ChannelOutbound-

    Handler.write()方法来处理数据时,你都需要确保没有任何的资源泄漏。

    消费入站消息的简单方式 由于消费入站数据是一项常规任务,所以Netty 提供了一个特殊的被

    称为SimpleChannelInboundHandler 的ChannelInboundHandler 实现。这个实现会在消

    息被channelRead0()方法消费之后自动释放消息。

      

     这个地方要重点注意:

    Channel 或ChannelPipeline 上的write()方法将一直传播事件通过整个ChannelPipeline

    但是ChannelHandlerContext的write()方法将传播给下个channelHandler

    /**
     * 代码清单 6-9 缓存到 ChannelHandlerContext 的引用
     *
     * @author <a href="mailto:norman.maurer@gmail.com">Norman Maurer</a>
     */
    public class WriteHandler extends ChannelHandlerAdapter {
        private ChannelHandlerContext ctx;
        @Override
        public void handlerAdded(ChannelHandlerContext ctx) {
            //存储到 ChannelHandlerContext的引用以供稍后使用
            this.ctx = ctx;
        }
        public void send(String msg) {
            //使用之前存储的到 ChannelHandlerContext的引用来发送消息
            ctx.writeAndFlush(msg);
        }
    }

    这段代码的问题在于它拥有状态①,即用于跟踪方法调用次数的实例变量count。将这个类
    的一个实例添加到ChannelPipeline将极有可能在它被多个并发的Channel访问时导致问
    题。(当然,这个简单的问题可以通过使channelRead()方法变为同步方法来修正。)
    总之,只应该在确定了你的ChannelHandler 是线程安全的时才使用@Sharable 注解。

     

    总结一下:
    ChannelHandler.exceptionCaught()的默认实现是简单地将当前异常转发给
    ChannelPipeline 中的下一个ChannelHandler;
    如果异常到达了ChannelPipeline 的尾端,它将会被记录为未被处理;
    要想定义自定义的处理逻辑,你需要重写exceptionCaught()方法。然后你需要决定
    是否需要将该异常传播出去。

    6.4.2 处理出站异常

     

    为何选择一种方式而不是另一种呢?对于细致的异常处理,你可能会发现,在调用出站操
    作时添加ChannelFutureListener 更合适,如代码清单6-13 所示。而对于一般的异常处
    理,你可能会发现,代码清单6-14 所示的自定义的ChannelOutboundHandler 实现的方式
    更加的简单。
    如果你的ChannelOutboundHandler 本身抛出了异常会发生什么呢?在这种情况下,
    Netty 本身会通知任何已经注册到对应ChannelPromise 的监听器。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    dede cms 怎样调用年月日
    织梦自定义表单提交成功后提示信息|跳转页面|跳转停留时间修改全攻略
    springmvc入门
    git全面理解
    mac os中try catch快捷键
    git与github关联
    mac下apache服务器访问DocumentRoot目录后报Forbidden错误
    分布式处理框架MapReduce
    资源调度框架YARN
    异常:failed on connection exception: java.net.ConnectException:
  • 原文地址:https://www.cnblogs.com/lakeslove/p/13080027.html
Copyright © 2020-2023  润新知