
6.2 事件转发器架构
在细化讲解initEventDispatcher方法中的每一个具体细节实现之前,首先看一下ActivitiEventDispatcher接口的架构设计,如图6-1所示。

图6-1 ActivitiEventDispatcher类架构图
根据图6-1可以很清晰地从全局角度了解ActivitiEventDispatcher的脉络,下面简单概括每个类的作用。
(1)ActivitiEventDispatcher:该接口定义了注册事件监听器、移除事件监听器、转发事件以及设置是否开启事件转发功能等方法。
(2)ActivitiEventSupport:该类内部维护一个全局事件监听器集合eventListeners和具体类型的事件监听器typedListeners集合,并且定义了这两个集合的添加、删除方法以及转发不同事件的方法。
(3)ActivitiEventDispatcherImpl:该类对ActivitiEventDispatcher接口进行实现,其内部持有ActivitiEventSupport实例,并可以根据当前类中的enabled属性值决定是否可以对事件进行转发。该类委托ActivitiEventSupport实例对象完成事件监听器的注册、移除和事件转发功能。由于ProcessEngineConfigurationImpl类中持有ActivitiEventDispatcher实例对象的引用,因此开发人员可以通过ProcessEngineConfigurationImpl获取ActivitiEventDispatcher实例对象进行事件监听器的注册、移除以及事件转发工作。
(4)ActivitiEvent:定义了获取事件类型、执行实例id,流程实例id,流程定义id的方法以及获取EngineServices实例对象的方法。所有的事件转发器均需要直接或者间接的实现该接口。
(5)ActivitiEventType:该枚举类定义了所有可以操控的事件类型。
(6)ActivitiEventListener:该接口定义了转发事件的方法onEvent以及事件监听器执行时如果程序出现异常该如何处理的方法isFailOnException。
注意
ActivitiEventDispatcher类为默认的事件转发器,该类负责管理所有的事件监听器。