Netty——ChannelPipeline

  • 类图
  •  

1 类图

1.1 ChannelOutboundInvoker

可以触发ChannelOutboundHandler相关方法

public interface ChannelOutboundInvoker {
    ChannelFuture bind(SocketAddress var1);
    ChannelFuture connect(SocketAddress var1);
    ChannelFuture connect(SocketAddress var1, SocketAddress var2);
    ChannelFuture disconnect();
    ChannelFuture close();
    ChannelFuture deregister();
    ChannelFuture bind(SocketAddress var1, ChannelPromise var2);
    ChannelFuture connect(SocketAddress var1, ChannelPromise var2);
    ChannelFuture connect(SocketAddress var1, SocketAddress var2, ChannelPromise var3);
    ChannelFuture disconnect(ChannelPromise var1);
    ChannelFuture close(ChannelPromise var1);
    ChannelFuture deregister(ChannelPromise var1);
    ChannelOutboundInvoker read();
    ChannelFuture write(Object var1);
    ChannelFuture write(Object var1, ChannelPromise var2);
    ChannelOutboundInvoker flush();
    ChannelFuture writeAndFlush(Object var1, ChannelPromise var2);
    ChannelFuture writeAndFlush(Object var1);
    ChannelPromise newPromise();
    ChannelProgressivePromise newProgressivePromise();
    ChannelFuture newSucceededFuture();
    ChannelFuture newFailedFuture(Throwable var1);
    ChannelPromise voidPromise();
}

1.2 ChannelInboundInvoker

可以触发ChannelInboundHandler相关方法

public interface ChannelInboundInvoker {
    ChannelInboundInvoker fireChannelRegistered();
    ChannelInboundInvoker fireChannelUnregistered();
    ChannelInboundInvoker fireChannelActive();
    ChannelInboundInvoker fireChannelInactive();
    ChannelInboundInvoker fireExceptionCaught(Throwable var1);
    ChannelInboundInvoker fireUserEventTriggered(Object var1);
    ChannelInboundInvoker fireChannelRead(Object var1);
    ChannelInboundInvoker fireChannelReadComplete();
    ChannelInboundInvoker fireChannelWritabilityChanged();
}

2.1 ChannelPipeline接口

操作内部ChannelHandler的相关方法添加内部ChannelHandleraddFirst, addLast, addBefore, addAfter,返回ChannelPipeline
删除内部ChannelHandlerremove, removeFirst, removeLast,返回ChannelPipeline或ChannelHandler
替换replace,返回ChannelPipeline或ChannelHandler
获取get, first, last, firstContext, lastContext等
继承自ChannelInboundInvoker的方法共9个 
继承自ChannelOutboundInvoker的方法就1个flush()方法

流程(read()入站):

1. ChannelInitializer中的initChannel()被执行

  • 将initChannel()中对应的handler加入pipeline,同时删除自身(ChannelInitializer本身也是handler)

2. DefaultChannelPipeline的fireChannelRead方法

  • public void channelRead(ChannelHandlerContext ctx, Object msg) {
        ctx.fireChannelRead(msg);
    }

3. 调用AbstractChannelHandlerContext中的方法:fireChannelRead(Object msg) ——> invokeChannelRead(final AbstractChannelHandlerContext next, Object msg)  ——> invokeChannelRead(Object msg)

  • 最后实际调用用户自己实现的channelRead()方法
  • 期间,事件传播的方式为findContextInbound()方法:寻找下一个符合要求的ChannelHandler
  • //1
    public ChannelHandlerContext fireChannelRead(Object msg) {
        invokeChannelRead(this.findContextInbound(32), msg); //进入2
        return this;
    }
    
    //2:寻找下一个符合要求的inboundHandler
    private AbstractChannelHandlerContext findContextInbound() {
        AbstractChannelHandlerContext ctx = this;
        do {
            ctx = ctx.next;
        } while (!ctx.inbound);
        return ctx;    //进入3
    }
    
    //3
    static void invokeChannelRead(final AbstractChannelHandlerContext next, Object msg) {
        final Object m = next.pipeline.touch(ObjectUtil.checkNotNull(msg, "msg"), next);
        EventExecutor executor = next.executor();
        if (executor.inEventLoop()) {
            next.invokeChannelRead(m);    //进入4
        } else {
            executor.execute(new Runnable() {
                public void run() {
                    next.invokeChannelRead(m);
                }
            });
        }
    }
    
    //4
    private void invokeChannelRead(Object msg) {
        if (this.invokeHandler()) {
            try {
                ((ChannelInboundHandler)this.handler()).channelRead(this, msg);//调用handler中实现的channelRead()方法
            } catch (Throwable var3) {
                this.notifyHandlerException(var3);
            }
        } else {
            this.fireChannelRead(msg);
        }
    }

     

Reference:

https://www.jianshu.com/p/87d376d4f251

https://zhuanlan.zhihu.com/p/104232421

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值