Flowable实战(三)流程部署管理

一、流程定义的版本 ??当部署流程定义时,数据库中的流程定义会是这个样子:

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 指定项目内资源文件部署
【Flowable实战(三)流程部署管理】??比如在resources/下新建资源文件single-task.bpmn20.xml

??部署示例代码:
// 资源路径 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 = ""; // 创建部署构建器 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 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参数:

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);

四、小结 ??本篇介绍了流程定义的版本、部署及管理的使用方法。当然,在实际应用中,还有很多细节需要优化,比如流程定义部署时的去重,分页获取流程列表等等。

    推荐阅读