Activiti 引擎事件监听模型代码走读

来源:互联网 发布:袖珍三公主淘宝 编辑:程序博客网 时间:2024/06/02 22:00

一、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

CommandExecutorImpl.execute(CommandConfig, Command<T>) line: 40

CommandExecutorImpl.execute(Command<T>) line: 35

TaskServiceImpl.newTask(String) line: 80

TaskServiceImpl.newTask() line: 76


新建一个task在工作流引擎中的方法调用过程
TaskService->commandExecuor.execute(Command<T>)->XXXXInterceptor.execute-> CommandInvoker.execute->NewTaskCmd.execute(CommandContext) ->TaskEntity.create(Date) 

五、包路径

org.activiti.engine.delegate.event.ActivitiEventDispatcher

org.activiti.engine.delegate.event.ActivitiEvent

org.activiti.engine.delegate.event.ActivitiEventListener



org.activiti.engine.delegate.ExecutionListener

org.activiti.engine.delegate.JavaDelegate


六、ExecutionListener

如:TransitionImpl实例持有ExecutionListener的集合

public class TransitionImpl extends ProcessElementImpl implements PvmTransition {

  protected List<ExecutionListener> executionListeners;


AtomicOperationTransitionNotifyListenerTake.execute方法会调用ExecutionListener.notify(execution)方法。



DefaultListenerFactory

org.activiti.engine.impl.bpmn.parser.factory. DefaultListenerFactory




ProcessEngineConfigurationImpl持有ListenerFactory引用


七、定义activiti流程节点

xml-》model (模型)-》behavior
AssertReceiveTask: xml->model (convertor)


八、初始化一个activiti的UserTask逻辑节点

1、UserTaskParseHandler.executeParse中bpmnParse.getActivityBehaviorFactory().createUserTaskActivityBehavior(userTask, taskDefinition)  用来初始化一个UserTaskActivityBehavior对象


2、初始化一个activiti的UserTask逻辑节点的方法调用堆栈

DefaultActivityBehaviorFactory.createUserTaskActivityBehavior(UserTask, TaskDefinition) line: 125

UserTaskParseHandler.executeParse(BpmnParse, UserTask) line: 50

UserTaskParseHandler.executeParse(BpmnParse, BaseElement) line: 1

UserTaskParseHandler(AbstractBpmnParseHandler<T>).parse(BpmnParse, BaseElement) line: 84

UserTaskParseHandler(AbstractFlowNodeBpmnParseHandler<T>).parse(BpmnParse, BaseElement) line: 27

UserTaskParseHandler(AbstractActivityBpmnParseHandler<T>).parse(BpmnParse, BaseElement) line: 36

BpmnParseHandlers.parseElement(BpmnParse, BaseElement) line: 73

BpmnParse.processFlowElements(Collection<FlowElement>) line: 428

ProcessParseHandler.transformProcess(BpmnParse, Process) line: 88

ProcessParseHandler.executeParse(BpmnParse, Process) line: 49

ProcessParseHandler.executeParse(BpmnParse, BaseElement) line: 1

ProcessParseHandler(AbstractBpmnParseHandler<T>).parse(BpmnParse, BaseElement) line: 84

BpmnParseHandlers.parseElement(BpmnParse, BaseElement) line: 73

BpmnParse.transformProcessDefinitions() line: 395

BpmnParse.execute() line: 231

BpmnDeployer.deploy(DeploymentEntity, Map<String,Object>) line: 107

DeploymentManager.deploy(DeploymentEntity, Map<String,Object>) line: 50

DeployCmd<T>.execute(CommandContext) line: 83

DeployCmd<T>.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

CommandExecutorImpl.execute(CommandConfig, Command<T>) line: 40

CommandExecutorImpl.execute(Command<T>) line: 35

RepositoryServiceImpl.deploy(DeploymentBuilderImpl) line: 78

DeploymentBuilderImpl.deploy() line: 156


九、引擎触发TaskListener监听的调用点


UserTaskActivityBehavior.execute(ActivityExecution execution)的最后会调用

TaskEntity.fireEvent(TaskListener.EVENTNAME_CREATE)方法->

 Context.getProcessEngineConfiguration()

              .getDelegateInterceptor()

              .handleInvocation(new TaskListenerInvocation(taskListener, (DelegateTask)this));



TaskEntity实例持有TaskDefinition引用,TaskDefinition引用持有TaskListener集合



十、引擎触发ExecutionListener监听的调用点

AbstractEventAtomicOperation.execute(InterpretableExecution execution)

List<ExecutionListener> exectionListeners = scope.getExecutionListeners(getEventName());

 listener.notify(execution);



AtomicOperationTransitionNotifyListenerTake

 List<ExecutionListener> executionListeners = transition.getExecutionListeners();

 listener.notify(execution);


十一、引擎调用暴露给外部的客户代码的实现

Context.getProcessEngineConfiguration()

              .getDelegateInterceptor()

              .handleInvocation(new TaskListenerInvocation(taskListener, (DelegateTask)this));


DelegateInterceptor

 * Interceptor responsible for handling calls to 'user code'. User code

 * represents external Java code (e.g. services and listeners) invoked by

 * activiti. The following is a list of classes that represent user code:

 * <ul>

 * <li>{@link org.activiti.engine.delegate.JavaDelegate}</li>

 * <li>{@link org.activiti.engine.delegate.ExecutionListener}</li>

 * <li>{@link org.activiti.engine.delegate.Expression}</li>

 * <li>{@link org.activiti.engine.delegate.TaskListener}</li>

 * </ul>

public interface DelegateInterceptor {


  public void handleInvocation(DelegateInvocation invocation) throws Exception;


}

0 0
原创粉丝点击