一、流程定义的版本
当部署流程定义时,数据库中的流程定义会是这个样子:
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
<code class="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>
部署示例代码:
<code class="java"> // 资源门路 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 接口方式
理论生产中,咱们须要接管前端传回来的流程定义数据,而后更新部署。
上面咱们省去前端拜访接口参数的展现,仅演示后端解决代码。
<code class="java">// 从前端接管到的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压缩包的部署形式。
<code class="java">String fileName = "path/multi-task.zip"; ZipInputStream inputStream = new ZipInputStream(new FileInputStream(fileName)); repositoryService.createDeployment() .name("multi-task.zip") .addZipInputStream(inputStream) .deploy();
补充:流程定义文件,须要由流程设计器生成。整合流程设计器,可参考:https://www.gaodaima.com/JinYJ20…
三、流程治理
业务零碎的第一步,就是须要一个列表能够浏览和治理流程定义。
3.1 获取已部署流程列表
<code class="java">@Autowired private RepositoryService repositoryService; public List getDeployList() { List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().list(); return list; }
3.2 读取流程图片
显然,治理页面须要显示流程图片的性能。
Flowable引擎会在流程部署时,主动生成流程图片。
获取流程图片办法:
<code class="java">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内容。
<code class="JAVA">// 依据processDefinitionId查问 ProcessDefinition pd = repositoryService.createProcessDefinitionQuery().processDefinitionId(processDefinitionId).singleResult(); // 读取资源流,resourceName为前端传回的资源名称 InputStream stream = repositoryService.getResourceAsStream(pd.getDeploymentId(), resourceName); //读取到的资源流再返回到前端
3.4 删除部署
一个流程定义不是通过流程定义ID删除,而是通过流程定义的部署ID删除。在执行删除时,会将和本次部署无关的资源一起删除。
<code class="java">repositoryService.deleteDeployment(deploymentId, true);
四、小结
本篇介绍了流程定义的版本、部署及治理的应用办法。当然,在理论利用中,还有很多细节须要优化,比方流程定义部署时的去重,分页获取流程列表等等。