Flowable源码地址:https://github.com/flowable/flowable-engine
Flowable-6.7.2 源码注释地址:https://github.com/solojin/flowable-6.7.2-annotated
包路径 org.flowable.common.engine.impl
EngineDeployer 引擎部署器
/**
* 引擎部署器,实现类有BPMN部署器BpmnDeployer,DMN部署器DmnDeployer,CMMN部署器CmmnDeployer,
* 规则部署器RulesDeployer,事件部署器EventDeployer,表单部署器FormDeployer,应用部署器AppDeployer
* @author Tijs Rademakers
*/
public interface EngineDeployer {
void deploy(EngineDeployment deployment, Map<String, Object> deploymentSettings);
}
BpmnDeployer BPMN部署器(上)
public class BpmnDeployer implements EngineDeployer {
private static final Logger LOGGER = LoggerFactory.getLogger(BpmnDeployer.class);
// ID生成器
protected IdGenerator idGenerator;
protected ParsedDeploymentBuilderFactory parsedDeploymentBuilderFactory;
protected BpmnDeploymentHelper bpmnDeploymentHelper;
protected CachingAndArtifactsManager cachingAndArtifactsManager;
protected ProcessDefinitionDiagramHelper processDefinitionDiagramHelper;
protected boolean usePrefixId;
@Override
public void deploy(EngineDeployment deployment, Map<String, Object> deploymentSettings) {
LOGGER.debug("Processing deployment {}", deployment.getName());
// 解析部署包含部署、流程定义和BPMN与每个流程定义关联的资源、解析和模型.
ParsedDeployment parsedDeployment = parsedDeploymentBuilderFactory
.getBuilderForDeploymentAndSettings(deployment, deploymentSettings)
.build();
bpmnDeploymentHelper.verifyProcessDefinitionsDoNotShareKeys(parsedDeployment.getAllProcessDefinitions());
bpmnDeploymentHelper.copyDeploymentValuesToProcessDefinitions(
parsedDeployment.getDeployment(), parsedDeployment.getAllProcessDefinitions());
bpmnDeploymentHelper.setResourceNamesOnProcessDefinitions(parsedDeployment);
createAndPersistNewDiagramsIfNeeded(parsedDeployment);
setProcessDefinitionDiagramNames(parsedDeployment);
if (deployment.isNew()) {
if (!deploymentSettings.containsKey(DeploymentSettings.IS_DERIVED_DEPLOYMENT)) {
Map<ProcessDefinitionEntity, ProcessDefinitionEntity> mapOfNewProcessDefinitionToPreviousVersion = getPreviousVersionsOfProcessDefinitions(parsedDeployment);
setProcessDefinitionVersionsAndIds(parsedDeployment, mapOfNewProcessDefinitionToPreviousVersion);
persistProcessDefinitionsAndAuthorizations(parsedDeployment);
updateTimersAndEvents(parsedDeployment, mapOfNewProcessDefinitionToPreviousVersion);
} else {
Map<ProcessDefinitionEntity, ProcessDefinitionEntity> mapOfNewProcessDefinitionToPreviousDerivedVersion =
getPreviousDerivedFromVersionsOfProcessDefinitions(parsedDeployment);
setDerivedProcessDefinitionVersionsAndIds(parsedDeployment, mapOfNewProcessDefinitionToPreviousDerivedVersion, deploymentSettings);
persistProcessDefinitionsAndAuthorizations(parsedDeployment);
}
} else {
makeProcessDefinitionsConsistentWithPersistedVersions(parsedDeployment);
}
cachingAndArtifactsManager.updateCachingAndArtifacts(parsedDeployment);
if (deployment.isNew()) {
dispatchProcessDefinitionEntityInitializedEvent(parsedDeployment);
}
for (ProcessDefinitionEntity processDefinition : parsedDeployment.getAllProcessDefinitions()) {
BpmnModel bpmnModel = parsedDeployment.getBpmnModelForProcessDefinition(processDefinition);
createLocalizationValues(processDefinition.getId(), bpmnModel.getProcessById(processDefinition.getKey()));
}
}
/**
* 如果部署是新的,为流程定义创建新图表、相关流程定义支持它,并且配置引擎以创建新图表。
* 当此方法创建新图表时,它还通过资源实体管理器将其持久化,并将其添加到部署的资源中。
*/
protected void createAndPersistNewDiagramsIfNeeded(ParsedDeployment parsedDeployment) {
final ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration();
final DeploymentEntity deploymentEntity = parsedDeployment.getDeployment();
final ResourceEntityManager resourceEntityManager = processEngineConfiguration.getResourceEntityManager();
for (ProcessDefinitionEntity processDefinition : parsedDeployment.getAllProcessDefinitions()) {
if (processDefinitionDiagramHelper.shouldCreateDiagram(processDefinition, deploymentEntity)) {
ResourceEntity resource = processDefinitionDiagramHelper.createDiagramForProcessDefinition(
processDefinition, parsedDeployment.getBpmnParseForProcessDefinition(processDefinition));
if (resource != null) {
resourceEntityManager.insert(resource, false);
deploymentEntity.addResource(resource); // now we'll find it if we look for the diagram name later.
}
}
}
}
/**
* 更新所有流程定义实体,使其具有正确的图表资源名称。
* 必须在createAndPersistNewDiagramsAsNeeded方法之后调用,以确保所有新创建的图都已将他们的资源附加到部署中。
*/
protected void setProcessDefinitionDiagramNames(ParsedDeployment parsedDeployment) {
Map<String, EngineResource> resources = parsedDeployment.getDeployment().getResources();
for (ProcessDefinitionEntity processDefinition : parsedDeployment.getAllProcessDefinitions()) {
String diagramResourceName = ResourceNameUtil.getProcessDiagramResourceNameFromDeployment(processDefinition, resources);
processDefinition.setDiagramResourceName(diagramResourceName);
}
}
/**
* 由主键和租户构造从新P流程定义实体到上一版本的映射。
* 如果不存在以前的版本,则不会创建映射条目。
*/
protected Map<ProcessDefinitionEntity, ProcessDefinitionEntity> getPreviousVersionsOfProcessDefinitions(
ParsedDeployment parsedDeployment) {
Map<ProcessDefinitionEntity, ProcessDefinitionEntity> result = new LinkedHashMap<>();
for (ProcessDefinitionEntity newDefinition : parsedDeployment.getAllProcessDefinitions()) {
ProcessDefinitionEntity existingDefinition = bpmnDeploymentHelper.getMostRecentVersionOfProcessDefinition(newDefinition);
if (existingDefinition != null) {
result.put(newDefinition, existingDefinition);
}
}
return result;
}
...
}