- 类图
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的相关方法 添加内部ChannelHandler addFirst, addLast, addBefore, addAfter,返回ChannelPipeline 删除内部ChannelHandler remove, 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: