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] 下一页
|