流程定义是一个流程的静态表达,流程执行则是依照流程定义启动的一个运行期表达,每一个流程执行都具备自己唯一的生命周期。流程执行应该考虑如下几点
- 流程节点的具体执行步骤是什么
- 当前流程执行到了哪个节点
- 流程执行如何从一个节点流转到另一个节点
- 如何执行相应节点的执行步骤
这里先引入几个接口
ActivityBehavior 提供方法execute,每个PvmActivity都会持有一个ActivityBehavior,表示该节点的行为。
PvmExecution 提供getActivity方法获取当前流程所执行的节点
InterpretableExecution 拥有take方法,该方法的参数为PvmTransition流程连线,可使流程从连线的源节点流向目标节点
AtomicOperation 原子操作接口,核心方法execute,实现者可获取当前流程执行所处的活动节点的ActivityBehavior对象,执行其execute方法来执行节点动作。如AtomicOperationActivityExecute
ActivityImpl activity = (ActivityImpl) execution.getActivity();
ActivityBehavior activityBehavior = activity.getActivityBehavior();
.......省略
activityBehavior.execute(execution);
现在就可以跟一下taskService.complete方法,经过责任链与命令模式,可以执行到CompleteTaskCmd.execute方法,该方法会调用TaskEntity的complete方法。
public void complete(Map variablesMap, boolean localScope) {
if (getDelegationState() != null && getDelegationState().equals(DelegationState.PENDING)) {
throw new ActivitiException("A delegated task cannot be completed, but should be resolved instead.");
}
//fire方法一般用于批量执行方法,这里是批量处理TaskListener接口的对象
fireEvent(TaskListener.EVENTNAME_COMPLETE);
if (Authentication.getAuthenticatedUserId() != null && processInstanceId != null) {
getProcessInstance().involveUser(Authentication.getAuthenticatedUserId(), IdentityLinkType.PARTICIPANT);
}
if(Context.getProcessEngineConfiguration().getEventDispatcher().isEnabled()) {
Context.getProcessEngineConfiguration().getEventDispatcher().dispatchEvent(
ActivitiEventBuilder.createEntityWithVariablesEvent(ActivitiEventType.TASK_COMPLETED, this, variablesMap, localScope));
}
Context
.getCommandContext()
.getTaskEntityManager()
.deleteTask(this, TaskEntity.DELETE_REASON_COMPLETED, false);
if (executionId!=null) {
ExecutionEntity execution = getExecution();
execution.removeTask(this);
execution.signal(null, null);
}
}
然后执行execution.signal方法,继续跟下去UserTaskActivityBehavior.signal ->leave -> bpmnActivityBehavior.performDefaultOutgoingBehavior(execution) -> performOutgoingBehavior ->
execution.take
public void take(PvmTransition transition) {
if (this.transition!=null) {
throw new PvmException("already taking a transition");
}
if (transition==null) {
throw new PvmException("transition is null");
}
setTransition((TransitionImpl) transition);
performOperation(AtomicOperation.TRANSITION_NOTIFY_LISTENER_END);
}
public void performOperation(AtomicOperation executionOperation) {
this.nextOperation = executionOperation;
if (!isOperating) {
isOperating = true;
while (nextOperation!=null) {
AtomicOperation currentOperation = this.nextOperation;
this.nextOperation = null;
if (log.isTraceEnabled()) {
log.trace("AtomicOperation: {} on {}", currentOperation, this);
}
currentOperation.execute(this);
}
isOperating = false;
}
}
这里执行了AtomicOperation的execute方法,在execute方法里面,会根据子类的方法选择相应的ActivityBehavior执行其中的execute方法,到这里一个流程执行就结束了。该方法主要调用了InterpretableExecution.take ----> AtomicOperation.execute -----> PvmExecution.getActivity ----> ActivityBehavior.execute 也就是上叙的四个接口方法