• Activiti 学习(二)—— Activiti 流程定义和部署



    概述

    在这一节,我们将创建一个 Activit 工作流,并启动这个流程,主要包含以下几个步骤:

    1. 定义流程,按照 BPMN 的规范,使用流程定义工具,用流程符号把整个流程描述出来

    2. 部署流程,把画好的流程定义文件,加载到数据库中,生成表的数据


    流程设计器的使用

    在 resources 目录下创建一个 bpmn 目录,用来存放流程定义文件。选中 bpmn 目录,点击菜单 New -> New Activity 6.x BPMN 2.x file,创建一个 *.bpmn20.xml。选中该文件,右键 view BPMN(Activity ) Diagram,可以看到 BPMN-Activiti-Diagram 流程设计页面。在该页面右键,可以在菜单选择图形,拖拽图形,连线,即可完成流程设计图

    连线的时候,要选中图形,这时在图形的右上角会出现一个箭头符号。双击选中箭头符号,右键按住不放即可拉长完成连线

    选中一个图形,下方会出现一个属性栏,以创建出差申请为例,这里只填任务名称和负责人


    流程部署

    流程部署就是将在设计器中定义的流程部署到 activiti 数据库中,Activiti 提供了多种部署流程的方式,包括自动部署、classpath 部署、输入流部署、zip/bar 部署和上传部署等方式,下面分别进行介绍:

    1. 自动部署

    Activiti7 可以自动部署流程,前提是在 resources 目录下,创建一个新的目录 processes,用来放置 bpmn 文件

    2. classpath 部署

    classpath 部署方式为采用代码进行部署,使用 Java 代码实现如下:

    public class ActivitDemo {
    
        @Test
        public void testDeployment() {
            // 1. 创建 ProcessEngine
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
            // 2. 获取 RepositoryService
            RepositoryService repositoryService = processEngine.getRepositoryService();
            // 3. 使用 service 进行流程部署,即把 bpmn 部署到数据库,并定义流程的名称
            Deployment deploy = repositoryService.createDeployment()
                	// 定义流程资源名称
                    .name("出差申请流程")
                	// 加载待部署的资源,可以多次引用
                    .addClasspathResource("bpmn/evection.bpmn20.xml")
                	// 完成部署
                    .deploy();
        }
    }
    

    3. 输入流部署

    Activiti 提供了按输入流(InputStream)方式部署资源,输入流的来源可以有多种,例如本地计算机、classpath 读取、网络读取方式等,下面是读取本地计算机方式进行部署方式的示例代码

    public class ActivitDemo {
    
        @Test
        public void testDeployment() {
            // 1. 创建 ProcessEngine
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
            // 2. 获取 RepositoryService
            RepositoryService repositoryService = processEngine.getRepositoryService();
            // 3. 获取输入流
            String filePath = "D:/workflow/bpmn/evection.bpmn20.xml";
            FileInputStream fileIns = new FileInputStream(filePath);
            // 4. 使用 service 进行流程部署
            Deployment deploy = repositoryService.createDeployment()
                    .name("出差申请流程")
                    .addInputStream("bpmn/evection.bpmn20.xml", fileIns)
                    .deploy();
        }
    }
    

    4. zip/bar 部署

    将流程资源文件压缩成 zip 包进行部署,同样采用流的方式

    public void deployProcessByZip() {
        // 1. 获取流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 2. 获取 RepositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();
        // 3. 流程部署
        InputStream inputStream = this.getClass()
            .getClassLoader()
            .getResourceAsStream("bpmn/evection.zip");
        ZipInputStream zipInputStream = new ZipInputStream(inputStream);
        repositoryService.createDeployment()
            .addZipInputStream(zipInputStream)
            .deploy();
    }
    

    5. 按字符串方式部署

    采用字符串方式进行部署,实际是把一个字符串转换为字节流后进行部署,也为开发人员提供了多一种部署方式

    public void deployProcessByStr() {
        // 1. 获取流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 2. 获取 RepositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();
        // 3. 构建字符串
        String str = "<?xml version="1.0" encoding="UTF-8"?><definitions>...</definitions>"
        // 4. 流程部署
        repositoryService.createDeployment()
            .name("出差申请流程")
            .addStr("bpmn/evection.bpmn20.xml", str)
            .deploy();
    }
    

    采用字符串进行部署的优点是可以通过用户界面定义一个流程,然后进行部署,或者在测试时,直接将流程代码写入程序,进行流程部署

    6. 动态 BPMN 模型部署

    通过在程序中动态生成流程模型方式进行部署,动态创建 BPMN,需要在程序中指定每一个元素,并给出元素间的关系,最后将这些元素整合为一个完整的 BPMN

    public void testDeploymentByBPMN() {
        // 1. 创建 BPMN 模型实例
        BpmnModel bpmnModel = new BpmnModel();
        // 2. 创建开始事件
        StartEvent startEvent = new StartEvent();
        startEvent.setId("startEvent");
        startEvent.setName("动态创建开始节点");
        // 3. 创建用户任务
        UserTask userTask = new UserTask();
        userTask.setId("userTask1");
        userTask.setName("用户任务节点1");
        // 4. 创建结束事件
        EndEvent endEvent = new EndEvent();
        endEvent.setId("endEvent");
        endEvent.setName("动态创建结束节点");
        // 5. 定义连接
        ArrayList<SequenceFlow> sequenceFlows = new ArrayList<>();
        ArrayList<SequenceFlow> toEnd = new ArrayList<>();
    
        SequenceFlow s1 = new SequenceFlow();
        s1.setId("sequenceFlow1");
        s1.setName("开始节点指向用户任务节点");
        s1.setSourceRef("startEvent");
        s1.setTargetRef("userTask1");
        sequenceFlows.add(s1);
        SequenceFlow s2 = new SequenceFlow();
        s2.setId("sequenceFlow2");
        s2.setName("用户任务节点指向结束节点");
        s2.setSourceRef("userTask1");
        s2.setTargetRef("endEvent");
        toEnd.add(s2);
    
        startEvent.setOutgoingFlows(sequenceFlows);
        userTask.setOutgoingFlows(toEnd);
        userTask.setIncomingFlows(sequenceFlows);
        endEvent.setIncomingFlows(toEnd);
    
        Process process = new Process();
        process.setId("process1");
        process.setName("test");
        process.addFlowElement(startEvent);
        process.addFlowElement(s1);
        process.addFlowElement(userTask);
        process.addFlowElement(s2);
        process.addFlowElement(endEvent);
        bpmnModel.addProcess(process);
        new BpmnAutoLayout(bpmnModel).execute();
        // 6. 部署
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RepositoryService repositoryService = processEngine.getRepositoryService();
        Deployment deploy = repositoryService.createDeployment()
            .name("出差申请流程")
            .addBpmnModel("evection.bpmn20.xml", bpmnModel)
            .deploy();
    }
    

    7. 相关数据表分析

    流程部署后,流程相关的资源全部以数据流的形式存储到数据表中,实际运行中,流程的处理都是通过调用数据表中的相关资源进行处理,下面介绍流程相关的数据表:

    • act_re_deployment

      流程部署表,用于存放流程定义的部署信息,部署一个流程就会增加一条记录

    • act_re_procdef

      流程定义表,用于存放流程定义的属性信息,和 act_re_deployment 是一对多的关系,act_re_procdef 表可以有多条记录,每条记录对应 act_re_deployment 中的一条记录

    • act_ge_bytearray

      资源文件表,部署流程时,会将 BPMN 流程定义文件保存为一条记录,如果部署的流程还包括其他资源,也会增加相应的记录,例如 png 图片文件


  • 相关阅读:
    「CF1380G」 Circular Dungeon
    「CF1208G」 Polygons
    P4827「国家集训队」 Crash 的文明世界
    「CF85E」 Guard Towers
    「BZOJ 2956」模积和
    「HEOI2016/TJOI2016」排序
    CF277E Binary Tree on Plane
    「SDOI2016」数字配对
    HNOI2020「Elegy」
    CSP-S2019「Symphony」
  • 原文地址:https://www.cnblogs.com/Yee-Q/p/15259905.html
Copyright © 2020-2023  润新知