系列文章目录
第一章 springboot+Activiti7整合实践 (一)
第二章 springboot+Activiti7整合实践 (二) 模型定义
第三章 springboot+Activiti7整合实践 (三) 流程定义
第四章 springboot+Activiti7整合实践 (四) 分配规则
前言
本章节分享讲发布模型,流程模型只有发布之后,才能应用到工作流中,之前我们设计了流程图,并设计了规则分配,那么怎么把这两部分发布并应用呢?我们一步步来实现。
一、模型发布
模型发布本身功能不复杂,通过respositoyService的deploy()即可讲模型发布,发布后会得到Deployment 发布对象信息,对应数据库表act_re_deployment,根据此信息可以获得ProcessDefinition流程定义信息,对象数据库act_re_procdef。
/**
* 发布流程
* 参数 model对象,bpmnBytes 流程图二进制数据
* */
public String addDeploymentByModel(Model model,byte[] bpmnBytes) {
Deployment deploy = repositoryService.createDeployment()
.key(model.getKey()).name(model.getName())
.addBytes(model.getKey() + BPMN_FILE_SUFFIX, bpmnBytes)
.deploy();
ProcessDefinition definition = repositoryService.createProcessDefinitionQuery()
.deploymentId(deploy.getId()).singleResult();
return definition.getId();
}
模型发布完成后,别忘了对model更新发布id和任务分配规则的processDefinitionId字段,使其关联,完整的代码逻辑如下。
public void deployModel(String id) {
// 1.1 校验流程模型存在
Model model = repositoryService.getModel(id);
if (ObjectUtils.isEmpty(model)) {
throw new RuntimeException("模型不存在");
}
// 1.2 校验流程图
// TODO 校验流程图的有效性;例如说,是否有开始的元素,是否有结束的元素;
byte[] bpmnBytes = repositoryService.getModelEditorSource(model.getId());
if (bpmnBytes == null) {
throw new RuntimeException("流程图不存在");
}
//1.3 校验任务分配规则已配置
workTaskAssignRuleService.checkTaskAssignRuleAllConfig(id);
// 2.1 创建流程定义
String definitionId = processDefinitionService.addDeploymentByModel(model,bpmnBytes);
// 2.2 将老的流程定义进行挂起。也就是说,只有最新部署的流程定义,才可以发起任务。
if(StringUtil.isNotEmpty(model.getDeploymentId())){
ProcessDefinition oldDefinition = processDefinitionService.getProcessDefinitionByDeploymentId(model.getDeploymentId());
processDefinitionService.suspendOrActiveApply(oldDefinition.getId(),1);
}
// 2.3 更新 model 的 deploymentId,进行关联
ProcessDefinition definition = processDefinitionService.getProcessDefinition(definitionId);
model.setDeploymentId(definition.getDeploymentId());
repositoryService.saveModel(model);
// 2.4 更新任务分配规则
// taskAssignRuleService.copyTaskAssignRules(id, definition.getId());
workTaskAssignRuleService.updateProcessDefinedIdByModelId(model.getId(),definitionId);
}
流程发布成功后,回到第二章节的流程定义中,可以补充完整列表展示的发布后的数据,如版本号、部署id、部署状态、部署事件。
二、概念补充
1.发布的流程我理解相当于java类的概念,规定了一个抽象的模型概念,流程如果想要使用,需要生成对象,就是流程实例,关键英文单词是ProcessInstance。
2.模型可以重复发布,每此发布,都会在act_re_deployment、act_re_procdef生成新的数据,model的版本号会+1,新老流程都可以使用,不过一般情况会讲老的流程挂起,只使用最新版本的流程。
总结
至此我们已经完成了流程定义和发布,发布后的模型即可启动使用,首先我们的要清楚流程发布后,只是当前我定义的流程已经可以使用,具体如何使用并进入到流程中,后面的章节会依次分享