sp; Worker线程线程的初始化 22)Worker线程(AioSocketChannel所属的AioEventLoop)独立运行后,取出其taskQueue中的第一个任务: 通过AioSocketChannel的ChannelPipeline触发pipeline的ChannelHandlerContext处理器链的channelRegistered注册事件 23)初始化ByteHeadHandler(ChannelOutboundHandler的子类),给它分配outByteBuf和outMsgBuf
24)触发处理器链的下一节点的channelRegistered事件
25)沿ChannelHandlerContext处理器链找到了自己定义 的用户AioSocketChannel初始化的HttpSnoopServerInitializer
26)ChannelInitializer是利用channelRegistered事件来初始化pipeline,向其安装相关channelHandler 27)从pipeline的处理器链删除初始化器,并触发下一处理器的channelRegistered事件 28) channelRegistered事件通过一个一个ChannelHandlerContext的fireChannelRegistered方法沿ByteHeadHandler传递到TailHandler,然后事件就停止传播
29)ChannelPipeline完成channelRegistered的事件触发后,就触发channelActive事件,
然后channelActive事件就随着ChannelHandlerContext和链式调用而在处理器链中传递,原理上上面差不多,故不详细说.
30)AioSocketChannel读取数据
由pipeline来读取数据
到TailHandler读取数据
31)向outbound方向上寻找最近的ChannelOperationHandler,委托它进行数据读取
首先委托给HttpResponseEncoder读取 HttpRequestDecoder委托给下一个ChannelOperationHandler读取 最终委托给ByteHeadHandler读取
32)最终由AioSocketChannel通过JDK的AsynchronousSocketChannel从底层读取
33)AioSocketChannel将读取数据操作委托给JDK的AsynchronousSocketChannel来完成,AioSocketChannel的当前线程不会被阻塞,立马返回处理taskQueue中下一任务或没任务时进入wait等待BlockingQueue的状态.
AsynchronousSocketChannel的read操作完成后,ReadHandler会被一条后台Daemon线程调用
34) ReadHandler的执行从Daemon线程转移回AioSocketChannle所属的AioEventLoop线程来执行
35)由AioEventLoop执行ReadHandler
36)数据已准备好,pipeline触发inboundBufferUpdated方法,然后pipeline中处理器链的inbound方向上的ChannelStateHandler的inboundBufferUpdated方法会被顺度调用
37)head 触发处理器链上inbound方向上的stateHandler的inboudBufferUpdated方法的顺序调用
38) 处理器链上inbound方向上的stateHandler的inboudBufferUpdated方法的顺序调用
-----这里省略,参考:
39)输入数据: DefaultChannelHandlerContext.flush(ChannelPromise promise)
40)由HttpServerCodec中的HttpResponseEncoder将HttpMessage 转换为ByteBuf
DefaultChannelHandlerContext.invokeFlush0(ChannelPromise promise)
41)由Pipeline的ByteHeadHandler将ByteBuf flush出去
42)AioSocketChannel将Flush操作委托给JDK AsyncounsSocketChannel异步进行,最终结果等写操作完成后由后台Deamon线程通知并执行WriteHandler.
而AioEventLoop线程是马上返回的,不会被write操作阻塞,然后继续执行taskQueue中的任务或进入wait状态等待BlockingQueue.
43)Write操作完成后,WriteHandler被后台Daemon线程调用
44)再次WriteHandler转交由关联的AioSocketChannel所属的AioEventLoop执行
45) AioEventLoop执行完WriteHandler后,整个接收和响应过程就完成了.
上一页 [1] [2]
|