您现在的位置: 爱51代码网 >> 范文 >> 文章正文
Netty4 SEDA 事件驱动原理分析
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] 

  • 上一篇文章:

  • 下一篇文章: 没有了
  • 最新文章 热点文章 相关文章
    sharepoint 2010 获取用户信息Us
    设计包含max函数的队列
    随机从数组中取出指定的不重复的
    mysql主从同步延迟方案解决的学习
    青岛科学六年级下册教材分析
    生日旅行总结
    中小板生日快乐随感
    送生日快乐桑葚乳酪小蛋糕
    写给女儿的生日快乐
    总分公司财务核算
    mysql主从同步延迟方案解决的学习
    生日旅行总结
    中小板生日快乐随感
    送生日快乐桑葚乳酪小蛋糕
    写给女儿的生日快乐
    总分公司财务核算
    恢复使用繁体字可行性研究报告
    保险受益人制度相关问题的探讨
    初中生地理读图能力培养的研究
    搞笑生日祝福
    单片机交通灯问题
    Android Parcelable和Serial
    Android中利用Fragment显示为
    HTTP 错误 500.19 - Interna
    如何获取别人访问我图片的ip
    java线程优先的问题
    Birt 如何动态添加超链接
    TOMCAT里面的WEB-APP里的项目
    android 4.2.1 一种高效log打
    Android批量插入数据
     



    设为首页 | 加入收藏 | 网站地图 | 友情链接 |