您现在的位置: 爱51代码网 >> 范文 >> 文章正文
Netty4 SEDA 事件驱动原理分析

Netty4 SEDA 事件驱动原理分析
  AioServerSocketChannel的事件处理线程(AioEventLoop)建立过程分析

(Bootstrap启动ServerSocketChannel处理线程的过程分析)

 

1:AbstractBootstrap.initAndRegister(): 向BossGroup(AioEventLoopGroup)

注册初始化后的AioServerSocketChannel,
2,调用MultithreadEventExecutorGroup.next()方法,在BossGroup中取出一个可用的EventLoop
3, 返回到MultithreadEventLoopGroup.register(Channel channel, ChannelPromise promise)方法,
将AioServerSocketChannel注册到(2)从BossGroup中取出的那个EventLoop.

4,进入到AioEventLoop.register(Channel channel, ChannelPromise future)方法

AioEventLoop实现了JDK的ScheduledExecutorService,持有一条线程,具备任务执行能力,

将AioServerSocketChannel测试到AioEventLoop后,由AioEventLoop执行ServerSocketChannel的accept新的socket的操作

5,进入到AbstractChannel.AbstractUnsafe.register(EventLoop eventLoop, ChannelPromise promise)方法,


6)进入到SingleThreadEventExecutor.execute(Runnable task)方法,执行startThread()后,AioServerSocketChannel的事件处理线程(AioEventLoop)启动,将由它来接管AioServerSocketChanel的事件处理(如Accept新的Socket),然后ServerBootstrap线程就进入等待状态,等待ServerSocketChannel绑定端口,然后等待ServerSocketChannel关闭.

 

7)先看下面


8)AioServerSocketChannel的事件处理线程AioEventLoop从一个BlockingDeque里取出新任务,取出的第一个任务是给AioServerSocketChannel注册JDK的AsynchronousServerSocketChannel(这才是真正和底层操作系统通信的ServerSocketChannel)

 

注册了:

9)Channel成功注册后,调用其pipeline.fireChannelRegistered()方法Fire这个channel注册的事件
10)ChannelPipeline的fireChannelRegistered方法先初始化 其处理器链的第一个元素HeadHandler,然后再执行HeadHandler的fireChannelRegistered()方法

DefaultChannelHandlerContext.fireChannelRegistered(),Netty4 的DefaultChannelHandlerContext对ChannelInboundInvoker接口的的事件处理方法fireXxxx(),具有链式传递效应,顺序将同一方向上的所有事件

11)然后, AioServerSocketChanel的pipeline的处理器链上的ChannelInitializer响应channelRegistered事件: 给pipeline安装上Acceptor,使得AioServerSocketChanel得以具备处理socket Accept事件的能力.
12) AioServerSocketChanel将accept委托给JDK的异步ServerSocketChannel来执行异步accept,并指定了事件处理器,当ACCEPT事件发生的时候, AcceptHandler就会被调用
然后AioServerSocketChanel的AioEventLoop就进入等待状态,等待taskQueue有任务到来
 

13)现在在浏览器输入http://127.0.0.1:8080/,向服务器发出请求

当相应事件发生时,JDK的CompletionHandler.complted(..)方法会被一条后台Daemon的线程调用 :

将接收到的SocketChannel包装成AioSocketChannel作为一个Message写进AioServerSocketChannel的ChannelPipeline的inboundMessageBuffer,然后Fire 相关事件inboundBufferUpdated事件

14)AioServerSocketChannel的ChannelPipeline Fire inboundBufferUpdated事件
15)沿inbound方向找到了SererBootstrapAcceptor的ChannelHandlerContext
16)inboundBufferUpdate事件传递到ServerBootstrapAcceptor
17) DefaultChannelHandlerContext.invokeInboundBufferUpdated(),调用Acceptor的inboundBufferUpdated方法

18)Acceptor取得AioSocketChannel,并向其添加ChannelInitializer
19)向ChildGroup注册AioSocketChannel

20)将AioSocketChannel注册到AioEventLoopGroup分配的AioEventLoop上
21)BOSS线程(AioServerSocketChannel所属的线程)启动AioSocketChannel所属的AioEventLoop线程,BOSS线程的Accept工作也至此结束,然后就去回去处理其taskQueue中的任务,或进入wait状态,等待下一个Accept事件的发生.

 &nb

[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批量插入数据
     



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