Activiti流程执行原理

文章详细阐述了流程执行的核心概念,包括流程节点的执行步骤、流程状态流转和原子操作。通过ActivityBehavior接口执行节点行为,PvmExecution获取当前活动,InterpretableExecution的take方法处理流程转移,而AtomicOperation接口协调这些动作,确保流程的正确执行。在任务完成时,涉及事件触发、任务删除和流程实例更新等操作。
摘要由CSDN通过智能技术生成

流程定义是一个流程的静态表达,流程执行则是依照流程定义启动的一个运行期表达,每一个流程执行都具备自己唯一的生命周期。流程执行应该考虑如下几点

  • 流程节点的具体执行步骤是什么
  • 当前流程执行到了哪个节点
  • 流程执行如何从一个节点流转到另一个节点
  • 如何执行相应节点的执行步骤

这里先引入几个接口
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 也就是上叙的四个接口方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值