1 流程实例助手类初始化源码
public void initHelpers() {
if (processInstanceHelper == null) {
processInstanceHelper = new ProcessInstanceHelper();
}
if (listenerNotificationHelper == null) {
listenerNotificationHelper = new ListenerNotificationHelper();
}
if (formHandlerHelper == null) {
formHandlerHelper = new FormHandlerHelper();
}
}
2 执行startProcessInstanceByKey方法,调用命令类StartProcessInstanceCmd
public ProcessInstance startProcessInstanceByKey(String processDefinitionKey) {
return commandExecutor.execute(new StartProcessInstanceCmd(processDefinitionKey, null, null, null));
}
3 重点执行execute方法
public ProcessInstance execute(CommandContext commandContext) {
DeploymentManager deploymentCache = CommandContextUtil.getProcessEngineConfiguration(commandContext).getDeploymentManager();
// Find the process definition
ProcessDefinition processDefinition = null;
if (processDefinitionId != null) {
processDefinition = deploymentCache.findDeployedProcessDefinitionById(processDefinitionId);
if (processDefinition == null) {
throw new FlowableObjectNotFoundException("No process definition found for id = '" + processDefinitionId + "'", ProcessDefinition.class);
}
} else if (processDefinitionKey != null && (tenantId == null || ProcessEngineConfiguration.NO_TENANT_ID.equals(tenantId))) {
processDefinition = deploymentCache.findDeployedLatestProcessDefinitionByKey(processDefinitionKey);
if (processDefinition == null) {
throw new FlowableObjectNotFoundException("No process definition found for key '" + processDefinitionKey + "'", ProcessDefinition.class);
}
} else if (processDefinitionKey != null && tenantId != null && !ProcessEngineConfiguration.NO_TENANT_ID.equals(tenantId)) {
processDefinition = deploymentCache.findDeployedLatestProcessDefinitionByKeyAndTenantId(processDefinitionKey, tenantId);
if (processDefinition == null) {
throw new FlowableObjectNotFoundException("No process definition found for key '" + processDefinitionKey + "' for tenant identifier " + tenantId, ProcessDefinition.class);
}
} else {
throw new FlowableIllegalArgumentException("processDefinitionKey and processDefinitionId are null");
}
processInstanceHelper = CommandContextUtil.getProcessEngineConfiguration(commandContext).getProcessInstanceHelper();
ProcessInstance processInstance = processInstanceHelper.createProcessInstance(processDefinition, businessKey, processInstanceName,
overrideDefinitionTenantId, variables, transientVariables, callbackId, callbackType, true);
return processInstance;
}
//创建流程实例
public ProcessInstance createProcessInstance(ProcessDefinition processDefinition, String businessKey, String processInstanceName,
String overrideDefinitionTenantId, Map variables, Map transientVariables,
String callbackId, String callbackType, boolean startProcessInstance) {
CommandContext commandContext = Context.getCommandContext();
if (Flowable5Util.isFlowable5ProcessDefinition(processDefinition, commandContext)) {
Flowable5CompatibilityHandler compatibilityHandler = Flowable5Util.getFlowable5CompatibilityHandler();
return compatibilityHandler.startProcessInstance(processDefinition.getKey(), processDefinition.getId(),
variables, transientVariables, businessKey, processDefinition.getTenantId(), processInstanceName);
}
// Do not start process a process instance if the process definition is suspended
if (ProcessDefinitionUtil.isProcessDefinitionSuspended(processDefinition.getId())) {
throw new FlowableException("Cannot start process instance. Process definition " + processDefinition.getName() + " (id = " + processDefinition.getId() + ") is suspended");
}
// Get model from cache
Process process = ProcessDefinitionUtil.getProcess(processDefinition.getId());
if (process == null) {
throw new FlowableException("Cannot start process instance. Process model " + processDefinition.getName() + " (id = " + processDefinition.getId() + ") could not be found");
}
FlowElement initialFlowElement = process.getInitialFlowElement();
if (initialFlowElement == null) {
throw new FlowableException("No start element found for process definition " + processDefinition.getId());
}
return createAndStartProcessInstanceWithInitialFlowElement(processDefinition, businessKey, processInstanceName, overrideDefinitionTenantId,
initialFlowElement, process, variables, transientVariables, callbackId, callbackType, startProcessInstance);
}
//开启流程实例
public void startProcessInstance(ExecutionEntity processInstance, CommandContext commandContext, Map variables) {
Process process = ProcessDefinitionUtil.getProcess(processInstance.getProcessDefinitionId());
processAvailableEventSubProcesses(processInstance, process, commandContext);
ExecutionEntity execution = processInstance.getExecutions().get(0); // There will always be one child execution created
CommandContextUtil.getAgenda(commandContext).planContinueProcessOperation(execution);
if (CommandContextUtil.getProcessEngineConfiguration().getEventDispatcher().isEnabled()) {
FlowableEventDispatcher eventDispatcher = CommandContextUtil.getProcessEngineConfiguration().getEventDispatcher();
eventDispatcher.dispatchEvent(FlowableEventBuilder.createProcessStartedEvent(execution, variables, false));
}
}
大概流程:
首先创建助手类 -> 在创建流程实例 -> 创建执行实例 -> 创建子执行实例