在activiti的startEvent中,我们可以通过initiator属性来设置一个变量,然后启动流程时会将authenticatedUserId(流程启动者)的值设置为activiti:initiator设置的字符串为key的流程变量上,下面看下这部分核心代码:
SubmitStartFormCmd的excute方法:
protected ProcessInstance execute(CommandContext commandContext, ProcessDefinitionEntity processDefinition) {
ExecutionEntity processInstance = null;
if (businessKey != null) {
processInstance = processDefinition.createProcessInstance(businessKey);
} else {
processInstance = processDefinition.createProcessInstance();
}
commandContext.getHistoryManager()
.reportFormPropertiesSubmitted(processInstance, properties, null);
StartFormHandler startFormHandler = processDefinition.getStartFormHandler();
startFormHandler.submitFormProperties(properties, processInstance);
processInstance.start();
return processInstance;
}
接下来就是揭开面纱的时候,进入createProcessInstance方法:
public ExecutionEntity createProcessInstance(String businessKey, ActivityImpl initial) {
ExecutionEntity processInstance = null;
if(initial == null) {
processInstance = (ExecutionEntity) super.createProcessInstance();
}else {
processInstance = (ExecutionEntity) super.createProcessInstanceForInitial(initial);
}
processInstance.setExecutions(new ArrayList<ExecutionEntity>());
processInstance.setProcessDefinition(processDefinition);
// Do not initialize variable map (let it happen lazily)
// Set business key (if any)
if (businessKey != null) {
processInstance.setBusinessKey(businessKey);
}
// Inherit tenant id (if any)
if (getTenantId() != null) {
processInstance.setTenantId(getTenantId());
}
// Reset the process instance in order to have the db-generated process instance id available
processInstance.setProcessInstance(processInstance);
// initialize the template-defined data objects as variables first
Map<String, Object> dataObjectVars = getVariables();
if (dataObjectVars != null) {
processInstance.setVariables(dataObjectVars);
}
String authenticatedUserId = Authentication.getAuthenticatedUserId();
String initiatorVariableName = (String) getProperty(BpmnParse.PROPERTYNAME_INITIATOR_VARIABLE_NAME);
if (initiatorVariableName!=null) {
processInstance.setVariable(initiatorVariableName, authenticatedUserId);
}
if (authenticatedUserId != null) {
processInstance.addIdentityLink(authenticatedUserId, null, IdentityLinkType.STARTER);
}
Context.getCommandContext().getHistoryManager()
.recordProcessInstanceStart(processInstance);
if (Context.getProcessEngineConfiguration().getEventDispatcher().isEnabled()) {
Context.getProcessEngineConfiguration().getEventDispatcher().dispatchEvent(
ActivitiEventBuilder.createEntityEvent(ActivitiEventType.ENTITY_CREATED, processInstance));
}
return processInstance;
}
BpmnParse.PROPERTYNAME_INITIATOR_VARIABLE_NAME的值为initiatorVariableName,在StartEvent启动时会通过activiti:initiator设置的字符串来设置key为initiatorVariableName的Map,然后启动流程时就会使用该Map。
如果关于这个问题还有疑问欢迎留言~