一、流程定义的版本

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

idkeynameversion
myProcess:1:676myProcessMy important process1

  如果咱们当初部署同一个流程的更新版本(例如批改局部用户工作),且放弃流程定义的id不变,那么流程定义表中会蕴含上面的记录:

idkeynameversion
myProcess:1:676myProcessMy important process1
myProcess:2:870myProcessMy important process2

  当调用执行流程时,会应用版本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 获取已部署流程列表

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

四、小结

  本篇介绍了流程定义的版本、部署及治理的应用办法。当然,在理论利用中,还有很多细节须要优化,比方流程定义部署时的去重,分页获取流程列表等等。