美文网首页
Flowable实战(三)流程部署管理

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

作者: 金杨杰 | 来源:发表于2022-01-10 22:28 被阅读0次

    一、流程定义的版本

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

    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/JinYJ2014/article/details/122412601

    三、流程管理

      业务系统的第一步,就是需要一个列表可以浏览和管理流程定义。

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

    四、小结

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

    相关文章

      网友评论

          本文标题:Flowable实战(三)流程部署管理

          本文链接:https://www.haomeiwen.com/subject/drmvcrtx.html