技术交流28群

服务热线

135-6963-3175

微信服务号

TriggerExecutionOperation源码解析 更新时间 2022-3-22 浏览3450次

TriggerExecutionOperation分析代码发现在行为类里主要用于离开节点。
触发等待状态并继续该过程的操作,离开该活动。

看代码:

@Override
  public void run() {
    FlowElement currentFlowElement = getCurrentFlowElement(execution);
    if (currentFlowElement instanceof FlowNode) {//是个节点
      
      ActivityBehavior activityBehavior = (ActivityBehavior) ((FlowNode) currentFlowElement).getBehavior();
      if (activityBehavior instanceof TriggerableActivityBehavior) {//属于可触发行为
        
        if (currentFlowElement instanceof BoundaryEvent) {//边界事件
          commandContext.getHistoryManager().recordActivityStart(execution);//历史记录活动开始
        }
        //触发行为,触发当前节点行为类,用于离开
        ((TriggerableActivityBehavior) activityBehavior).trigger(execution, null, null);
        
        if (currentFlowElement instanceof BoundaryEvent) {//边界事件
          commandContext.getHistoryManager().recordActivityEnd(execution, null);//历史记录活动结束
        }
        
      } else {
        throw new ActivitiException("Invalid behavior: " + activityBehavior + " should implement " + TriggerableActivityBehavior.class.getName());
      }
    } else {
      throw new ActivitiException("Programmatic error: no current flow element found or invalid type: " + currentFlowElement + ". Halting.");
    }
  }

做了操作:

若是个节点且行为属于可触发行为(也就是节点行为类实现了以下接口)

public interface TriggerableActivityBehavior extends ActivityBehavior {
  void trigger(DelegateExecution execution, String signalEvent, Object signalData);
}

则继续执行:

a.当是边界事件,则记录历史活动开始(入库ACT_HI_ACTINST)

b.触发行为,触发当前节点行为类的trigger (大多数trigger用于离开)

c.当是边界事件,则:记录历史活动结束(更新结束信息(结束时间、花费时间、删除原因));

                             历史活动实例结束事件调度;


我们可以看几个行为类的trigger方法:

UserTaskActivityBehavior:
public void trigger(DelegateExecution execution, String signalName, Object signalData) {
    CommandContext commandContext = Context.getCommandContext();
    TaskEntityManager taskEntityManager = commandContext.getTaskEntityManager();
    List<TaskEntity> taskEntities = taskEntityManager.findTasksByExecutionId(execution.getId()); // Should be only one
    for (TaskEntity taskEntity : taskEntities) {
      if (!taskEntity.isDeleted()) {
        throw new ActivitiException("UserTask should not be signalled before complete");
      }
    }
    //离开操作
    leave(execution);
}
ReceiveTaskActivityBehavior:
public void trigger(DelegateExecution execution, String signalName, Object data) {
    leave(execution);
}

发现trigger主要用于离开节点(planTakeOutgoingSequenceFlowsOperation)