美文网首页
activiti动态部署

activiti动态部署

作者: 西城丶 | 来源:发表于2021-04-22 06:57 被阅读0次

由spring自动部署引申的部署操作,spring-activiti包有提供自动化部署的方法,主要注册类是:

@Bean(name = "processEngineConfiguration")
public SpringProcessEngineConfiguration processEngineConfiguration(){
   PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
   //取得ProcessEngineConfiguration对象
   SpringProcessEngineConfiguration engineConfiguration = new SpringProcessEngineConfiguration();
   engineConfiguration.setDatabaseType(ProcessEngineConfigurationImpl.DATABASE_TYPE_MYSQL);
   engineConfiguration.setDataSource(dataSource);
   engineConfiguration.setHistoryLevel(HistoryLevel.FULL);
    // 主要是提供部署资源路径,用资源路径的文件进行部署
   engineConfiguration.setDeploymentResources();
   engineConfiguration.setActivityFontName("宋体");
   engineConfiguration.setLabelFontName("宋体");
   engineConfiguration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
   engineConfiguration.setTransactionManager(transactionManager);
   engineConfiguration.setProcessDiagramGenerator(customProcessDiagramGenerator);
   return engineConfiguration;
}

查看SpringProcessEngineConfiguration源码得到部署的步骤为:

@Override
public ProcessEngine buildProcessEngine() {
  ProcessEngine processEngine = super.buildProcessEngine();
  ProcessEngines.setInitialized(true);
  autoDeployResources(processEngine);
  return processEngine;
}
protected void autoDeployResources(ProcessEngine processEngine) {
  if (deploymentResources != null && deploymentResources.length > 0) {
    final AutoDeploymentStrategy strategy = getAutoDeploymentStrategy(deploymentMode);
    strategy.deployResources(deploymentName, deploymentResources, processEngine.getRepositoryService());
  }
}

这里采用策略模式去处理部署流程,具体部署方法:

public void deployResources(final String deploymentNameHint, final Resource[] resources, final RepositoryService repositoryService) {

  // Create a single deployment for all resources using the name hint as
  // the
  // literal name
  final DeploymentBuilder deploymentBuilder = repositoryService.createDeployment().enableDuplicateFiltering().name(deploymentNameHint);

  for (final Resource resource : resources) {
    final String resourceName = determineResourceName(resource);

    try {
      if (resourceName.endsWith(".bar") || resourceName.endsWith(".zip") || resourceName.endsWith(".jar")) {
        deploymentBuilder.addZipInputStream(new ZipInputStream(resource.getInputStream()));
      } else {
        deploymentBuilder.addInputStream(resourceName, resource.getInputStream());
      }
    } catch (IOException e) {
      throw new ActivitiException("couldn't auto deploy resource '" + resource + "': " + e.getMessage(), e);
    }
  }

  deploymentBuilder.deploy();

}

可以看到其中最主要的是采用了DeploymentBuilder类进行部署

这个类提供了几种方式来部署

DeploymentBuilder addInputStream(String resourceName, InputStream inputStream);

DeploymentBuilder addClasspathResource(String resource);

DeploymentBuilder addString(String resourceName, String text);

DeploymentBuilder addBytes(String resourceName, byte[] bytes);

DeploymentBuilder addZipInputStream(ZipInputStream zipInputStream);

DeploymentBuilder addBpmnModel(String resourceName, BpmnModel bpmnModel);

我们可以有几种方式来实现部署,后台接口可以接收文件和String字符串来进行部署。

DeploymentBuilder deployment = repositoryService.createDeployment();
deployment.enableDuplicateFiltering();
// 这里接收文件的bytes数据进行部署,资源名称注意后缀加上.bpmn
deployment.addBytes(deploymentDTO.getName()+".bpmn",deploymentDTO.getProcess());
deployment.category(deploymentDTO.getClassify());
deployment.key(deploymentDTO.getId());
deployment.name(deploymentDTO.getName());
Deployment deploy = deployment.deploy();

注意点:

资源名称需要为"bpmn20.xml", "bpmn"的后缀,不然的话不会写进act_re_procdef流程部署表,相当于部署没有生效,部署的时候会判断是否是这个后缀。

for (ResourceEntity resource : deployment.getResources().values()) {
    // 这个位置
  if (isBpmnResource(resource.getName())) {
    log.debug("Processing BPMN resource {}", resource.getName());
    BpmnParse parse = createBpmnParseFromResource(resource);
    for (ProcessDefinitionEntity processDefinition : parse.getProcessDefinitions()) {
      processDefinitions.add(processDefinition);
      processDefinitionsToBpmnParseMap.put(processDefinition, parse);
      processDefinitionsToResourceMap.put(processDefinition, resource);
    }
  }
}

protected boolean isBpmnResource(String resourceName) {
    for (String suffix : ResourceNameUtil.BPMN_RESOURCE_SUFFIXES) {
      if (resourceName.endsWith(suffix)) {
        return true;
      }
    }

    return false;
  }

public static final String[] BPMN_RESOURCE_SUFFIXES = new String[] { "bpmn20.xml", "bpmn" };

相关文章

网友评论

      本文标题:activiti动态部署

      本文链接:https://www.haomeiwen.com/subject/tsfxrltx.html