一、ActivitiEventDispatcher发布事件
ProcessEngineConfigurationImpl 持有ActivitiEventDispatcher引用,成员属性名为eventDispatcher。
CommandContext为线程级的,CommandContext又持有ProcessEngineConfigurationImpl 引用。
->CommandContext可通过ProcessEngineConfigurationImpl 获取ActivitiEventDispatcher
例子:
TaskEntity.insert中会发布一个事件,代码如下:
commandContext.getProcessEngineConfiguration().getEventDispatcher().dispatchEvent(
ActivitiEventBuilder.createEntityEvent(ActivitiEventType.ENTITY_CREATED, this));
其中TaskEntity.insert的被调用过程为:
UserTaskActivityBehavior.execute->TaskEntity.createAndInsert(execution)->TaskEntity.insert
二、ActivitiEventDispatcherImpl的实现
1、ActivitiEventDispatcherImpl的具体实现实在其成员属性ActivitiEventSupport中定义。
2、ActivitiEventSupport实例内部维护了一个监听器集合成员属性和一个键值对集合:protected List<ActivitiEventListener> eventListeners;protected Map<ActivitiEventType, List<ActivitiEventListener>> typedListeners;
添加删除监听器都是操作这两个集合。
3、发布事件通过ActivitiEventSupport.dispatchEvent,该方法会调用两个集合中事件相关的监听器的onEvent(event)方法,
三、监听器注册
ActivitiEventDispatcherImpl.addEventListener
四、新建一个task在工作流引擎中的调用堆栈
TaskEventsTest
新建一个task在工作流引擎中的调用堆栈
TaskEntity.create(Date) line: 166
NewTaskCmd.execute(CommandContext) line: 38
NewTaskCmd.execute(CommandContext) line: 1
CommandInvoker.execute(CommandConfig, Command<T>) line: 24
CommandContextInterceptor.execute(CommandConfig, Command<T>) line: 57
LogInterceptor.execute(CommandConfig, Command<T>) line: 37