Reactor模式角色构成(Reactor模式一共有5中角色构成):
- Handle(句柄或是描述符):本质上是一种资源,有操作系统提供的;该资源表示一个个事件,比如说文件描述符,或是针对网络编程的Socket描述符。事件既可以来自于内部,也可以来自于内部;外部事件例如客户端的连接请求,客户端的数据等;内部事件例如操作系统的定时器事件等。他本质上一个文件描述符。Handle是事件发生的发源地。
- Synchronous Event Demultiplexer(同步事件分离器):它本身是一个系统的调用,用于等待事件的发生(事件可以有一个,也可以有多个)。调用方法在调用它的时候回被阻塞,一直阻塞到同步事件分离器产生事件位置。对于Linux系统来说,同步事件指的就是常用的I/O多路复用机制,比如说select,poll,epoll等。在Java NIO中同步事件分离器指的是Selector;对应的阻塞方法是select()方法;
- Event Handler(事件处理器):它本身由多个回调方法构成,这些回调方法构成了与应用相关的 对于某个事件的反馈机制。Netty相比于Java Nio来说,事件处理器角色上进行了一个升级,他给我们提供了大量的回调方法,供我们在特定事件产生时,实现相应的回调方法进行相应的业务处理。

- Concrete Event Handler(具体事件处理器):它是事件处理器的实现。它本身实现了事件处理器所提供的各个回调方法,从而实现了特定的业务逻辑。他本质上就是我们所编写的一个个处理器的实现。
- Initiation Dispatcher(初始分发器):实际上Reactor角色。本身定义了一些规范,这些规范用语控制事件的调度方式,同时又提供了应用处理器的注册,删除等设施。它本身是事件的核心所在,Initiation Dispatcher会通过同步事件分离器来等待事件的发生 。一旦事件发生,Initiation Dispatcher首先会分离出每个事件,然后调用事件处理器,最后调用相关的回调方法来处理这些事件。
Reactor模式的流程
Reactor模式的流程
- 当应用向Initiation Dispatcher注册具体的事件处理器时,应用会标识出该事件处理器希望Initiation Dispatcher在某个事件发生时向其通知的该事件,该事件与 Handle 关联
- Initiation Dispatcher会要求每个事件处理器向其传递内部的Handle。该Handle向操作系统标识了事件处理器。
- 当所有的事件处理器注册完毕后,应用会调用handle_events方法来启动Initiation Dispatcher的事件循环。这时,Initiation Dispatcher会将每个注册的事件管理器的Handle合并起来,并使用同步事件分离器等待这些事件的发生。比如说,TCP协议层会使用select同步事件分离器操作来等待客户端发送的数据到达连接的socket handle上。
- 当与某个事件源对应的Handle変为ready状态时(比如说,TCP socket変为等待读状态时),同步事件分离器就会通知Initiation Dispatcher。
- Initiation Dispatcher会触发事件处理器的回调方法,从而响应这个处于ready状态的Handle。当事件发生时,Initiation Dispatcher会将被事件源激活的 Handle作为『key』来寻找并分发怡当的事件处理器回调方法。
- Initiation Dispatcher会回调事件处理器的handle_events回调方法来执行特定于应用的功能(开发者自己所编写的功能),从而晌应这个事件。所发生的事件类型可以作为该方法参数并被该方法内部使用来执行额外的特定于服务的分离与分发。
网友评论