Netty的深入浅出--54.Reactor的流程讲解

上一章我们分析了Reactor五大组件进行了深入分析,现在我们将五大组件的运行流程进行系统性的分析。

首先Initiation Dispatcher会将所有的Event Handler注册到Initiation Dispatcher里面,注册的时候指定感兴趣的事件。而这个感兴趣的事件时根据Handler来标识的。而Handler是被Event Handler所拥有的。在NIO中感兴趣的事件就是interestKey。当感兴趣的事件在Event Handler所拥有的Handle中产生的时候,由Initiation Dispatcher去通知注册到Event Handler的具体的Concrete Event Handler.当准备工作完成之后,Initiation Dispatcher就会进入到死循环,然后他会通过Synchronous Event Demultiplexer调用select()来等待事件的发送。

当handle上的事件产生之后,那么这个Synchronous Event emultiplexer就会获取到产生事件的集合并且返回给Initiation Dispatcher,接着Initiation Dispatcher调用select(handlers)来获取所有对应当前事件的处理器。然后遍历这个事件处理器,根据这个事件类型来调用注册到其上的Event Handler,通过里面的handler_event(type)方法来调用Concrete Event Handler.

两个描述reactor的设计模式是同一个。

mainReactor 和 subReactor与上一张图里面的 Initiation Dispatcher是同一个,只是在scalable io in java 中将使用两个 Initiation Dispatcher来完成连接,mainReactor只负责客户端的连接,连接完成之后通过acceptor将后续的任务交给了subReactor进行处理。

Acceptor分析:在服务器绑定到端口号上的时候,首先mainReactor会创建一系列的初始化组件,然后绑定到相应的端口号,在这个过程中会向bossGroup增加一个handler(ChannelInitialize也就是一个inboundHandler),在这个handler里面会new出Acceptor这个对象。简单来说Acceptor是由netty内置的一个组件来完成的(我们在开发的时候是接触不到的)。当服务器绑定到特定的地址的时候,就自动创建好了这个实例,并且把它加到ChannelPipeline当中。而且在加入到时候会将它加载channelPipeline的最后面的初始化处理器上。它收到客户端发过来的这个数据之后,它会在chennelRead这个方法中,将当前的channel绑定到subReactor当中。

 

 

 

猜你喜欢

转载自blog.csdn.net/qq_37909508/article/details/91395741