
6.1 初始化事件转发器
事件转发器的初始化过程如代码清单6-1所示。
代码清单6-1 ProcessEngineConfigurationImpl.java

如果想要使用事件转发器发布事件,那么初始化事件转发器是一个必不可少的环节,下面概括总结initEventDispatcher方法的初始化逻辑。
(1)第6~7行初始化前的准备工作。
在2.4节中详细讲了开关属性的初始化过程,简单概括为:首先判断指定的开关属性值是否为空,如果不为空则直接使用客户端指定的类或者值进行初始化,否则使用系统内置的类或者具体值进行初始化工作。事件转发器的处理也不例外,引擎默认使用的事件转发器为ActivitiEventDispatcherImpl类,当然也可以通过设置ProcessEngineConfigurationImpl类中的eventDispatcher属性值注入自定义事件转发器。
(2)开启事件转发功能。
第9行设置eventDispatcher对象的属性enabled值为true,从该属性的默认值可以看出,流程引擎默认开启了事件转发功能,如果开发人员不打算使用Activiti中的事件转发功能,可以将该enableEventDispatcher开关属性值设置为false从而对事件转发功能进行全局禁用。
(3)注册全局事件监听器。
首先第10行判断eventListeners集合是否为空,如果该集合不为空,则第11~12行循环遍历该集合并调用eventDispatcher对象中的addEventListener方法注册全局事件监听器。
(4)注册具体类型的事件监听器。
步骤(3)负责注册全局事件监听器,第14~19行负责注册具体类型的事件监听器,typedEventListeners集合为Map数据结构,key对应具体的事件类型,value对应具体类型的事件监听器,处理流程比较简单,首先遍历typedEventListeners集合,第16行提取key值并将其转化为ActivitiEventType类型的数组(具体处理过程是将key值使用“, ”进行分割,可以参考getTypesFromString方法的具体实现),最后第17~18行根据listenerToAdd对象和types进行具体类型的事件监听器的注册工作。
建议
在实际项目开发中,建议开发人员开启事件转发功能。