Reactor模式一共由5种角色构成
1. Handler
Handler对于Windows系统来说是句柄,对于Unix系统来说是描述符。
本质上表示一种资源,是由操作系统提供的。该资源表示一个个的事件,比如说文件描述符,或是针对网络编程中的socket描述符。事件既可以来至于外部,也可以来自于内部。外部事件比如说客服端的连接请求,客服端发过来的数据符。内部事件比如说操作系统的定时器事件等,它本质上一个文件描述符。
Handle本身是事件的发源地。
2. Synchronous Event Demultiplexer(同步事件分离器)
它本身是一个系统调用,用于等待事件的发生(事件可能是一个,也可能是多个)。调用方法在调用它的时候会被阻塞,一直到同步事件分离器上有事件产生。同步事件分离器指的是常用的IO多路复用,比如select、poll、epoll。在Java NIO领域中,同步事件分离器对应的组件就是selector,阻塞方法就是select。
3. Event Handler(事件处理器)
本省由多个回调方法构成,这些回调方法构成了与应用相关的对于某个事件的反馈机制。Java NIO中没有对应的相关类,由开发者自行开发。但是Netty相对于NIO来说,在事件处理这个角色上进行了一个升级,他为我们开发者提供了大量的回调方法,供我们在特定的事件产生时,实现相应的回调方法进行业务逻辑的处理。
4. ConCrete Event Handler(具体事件处理器)
是事件处理器的具体实现。它本身实现了事件处理器所提供的各个方法,从而实现了特定的业务逻辑,它本质上就是我们所编写的一个个处理器实现。
5. Initiation Dispatcher(初始分发器)
实际上就是Reactor角色,它本身定义了一些规范,这些规范用于事件的调度方式,同时又提供了应用进行处理器的注册、删除等设施。它本身是整个处理器的核心所在。Initiation Dispatcher 会通过同步事件分离器来等待事件的发生,一旦事件发生,他首先会分离出每一个事件,然后调用事件处理器,最后调用相关的回调方法来处理这些事件。