共计 3450 个字符,预计需要花费 9 分钟才能阅读完成。
一、流程定义的版本
当部署流程定义时,数据库中的流程定义会是这个样子:
id | key | name | version |
---|---|---|---|
myProcess:1:676 | myProcess | My important process | 1 |
如果咱们当初部署同一个流程的更新版本(例如批改局部用户工作),且放弃流程定义的 id 不变,那么流程定义表中会蕴含上面的记录:
id | key | name | version |
---|---|---|---|
myProcess:1:676 | myProcess | My important process | 1 |
myProcess:2:870 | myProcess | My important process | 2 |
当调用执行流程时,会应用版本 2 的流程定义,因为这是这个流程定义的最新版本。
二、流程部署形式
2.1 指定我的项目内资源文件部署
比方在 resources/ 下新建资源文件 single-task.bpmn20.xml
<?xml version="1.0" encoding="UTF-8"?>
<definitions
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:flowable="http://flowable.org/bpmn"
targetNamespace="Examples">
<process id="singleTask" name="The One Task Process">
<startEvent id="theStart" />
<sequenceFlow id="flow1" sourceRef="theStart" targetRef="theTask" />
<userTask id="theTask" name="my task" flowable:assignee="zhangsan" />
<sequenceFlow id="flow2" sourceRef="theTask" targetRef="theEnd" />
<endEvent id="theEnd" />
</process>
</definitions>
部署示例代码:
// 资源门路
String path = "single-task.bpmn20.xml";
// 创立部署构建器
DeploymentBuilder deploymentBuilder = repositoryService.createDeployment();
// 增加资源
deploymentBuilder.addClasspathResource(path);
// 执行部署
deploymentBuilder.deploy();
// 验证部署
long count = repositoryService.createProcessDefinitionQuery().processDefinitionKey("singleTask").count();
// count 等于 1,则阐明部署胜利
只有是在我的项目 class 目录下的资源,都能够用这种形式部署。
这种形式个别用于开发测试阶段,真正的生产环境,是通过与 web 治理页面交互部署。
2.2 springboot 主动部署
在 springboot 环境下,resources/processes 目录下的任何 BPMN 2.0 流程定义都会被主动部署。
2.3 接口方式
理论生产中,咱们须要接管前端传回来的流程定义数据,而后更新部署。
上面咱们省去前端拜访接口参数的展现,仅演示后端解决代码。
// 从前端接管到的 XML 字符串
// 此处省去 xml 具体内容,可参考 2.1 的 single-task.bpmn20.xml 示例
// 留神将 id 定义为 singleTask2,以便跟 2.1 的内容作出区别
String text = "<?xml version=\"1.0\"encoding=\"UTF-8\"?><definitions...</definitions>";
// 创立部署构建器
DeploymentBuilder deploymentBuilder = repositoryService.createDeployment();
// 执行部署
deploymentBuilder.addString("single-task2.bpmn20.xml", text).deploy();
// 验证部署
long count = repositoryService.createProcessDefinitionQuery().processDefinitionKey("singleTask2").count();
// count 等于 1,则阐明部署胜利
2.4 zip 压缩包
当咱们须要一次同时部署多个资源时,能够通过 zip 压缩包的部署形式。
String fileName = "path/multi-task.zip";
ZipInputStream inputStream = new ZipInputStream(new FileInputStream(fileName));
repositoryService.createDeployment()
.name("multi-task.zip")
.addZipInputStream(inputStream)
.deploy();
补充:流程定义文件,须要由流程设计器生成。整合流程设计器,可参考:https://blog.csdn.net/JinYJ20…
三、流程治理
业务零碎的第一步,就是须要一个列表能够浏览和治理流程定义。
3.1 获取已部署流程列表
@Autowired
private RepositoryService repositoryService;
public List getDeployList() {List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().list();
return list;
}
3.2 读取流程图片
显然,治理页面须要显示流程图片的性能。
Flowable 引擎会在流程部署时,主动生成流程图片。
获取流程图片办法:
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.processDefinitionKey("singleTask")
.singleResult();
String diagramResourceName = processDefinition.getDiagramResourceName();
InputStream imageStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(), diagramResourceName);
留神:如果不须要或不心愿在部署时生成流程图,能够在流程引擎配置中设置 isCreateDiagramOnDeploy 参数:
<property name="createDiagramOnDeploy" value="false" />
3.3 读取流程定义的 XML
治理界面可减少“显示流程定义代码”性能,即读取显示流程定义的 XML 内容。
// 依据 processDefinitionId 查问
ProcessDefinition pd = repositoryService.createProcessDefinitionQuery().processDefinitionId(processDefinitionId).singleResult();
// 读取资源流,resourceName 为前端传回的资源名称
InputStream stream = repositoryService.getResourceAsStream(pd.getDeploymentId(), resourceName);
// 读取到的资源流再返回到前端
3.4 删除部署
一个流程定义不是通过流程定义 ID 删除,而是通过流程定义的部署 ID 删除。在执行删除时,会将和本次部署无关的资源一起删除。
repositoryService.deleteDeployment(deploymentId, true);
四、小结
本篇介绍了流程定义的版本、部署及治理的应用办法。当然,在理论利用中,还有很多细节须要优化,比方流程定义部署时的去重,分页获取流程列表等等。