• 【Flowable】Springboot使用Flowable(一)


    一、项目依赖

    <dependency>
                <groupId>org.flowablegroupId>
                <artifactId>flowable-engineartifactId>
                <version>6.3.0version>
            dependency>
            <dependency>
                <groupId>mysqlgroupId>
                <artifactId>mysql-connector-javaartifactId>
                <version>8.0.21version>
            dependency>
    
            <dependency>
                <groupId>junitgroupId>
                <artifactId>junitartifactId>
                <version>4.13.2version>
                <scope>testscope>
            dependency>
    
            <dependency>
                <groupId>org.slf4jgroupId>
                <artifactId>slf4j-apiartifactId>
                <version>1.7.21version>
            dependency>
    
            <dependency>
                <groupId>org.slf4jgroupId>
                <artifactId>slf4j-log4j12artifactId>
                <version>1.7.21version>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    二、新建Test类

    public class Test01 {
    
        /**
         * 获取流程引擎对象
         */
        @Test
        public void testProcessEngine() {
            // 获取 ProcessEngineConfiguration 对象
            ProcessEngineConfiguration configuration = new StandaloneProcessEngineConfiguration();
    
            //配置相关的数据库连接信息
            configuration.setJdbcDriver("com.mysql.cj.jdbc.Driver");
            configuration.setJdbcUsername("xxx");
            configuration.setJdbcPassword("xxx");
            configuration.setJdbcUrl("jdbc:mysql://xxx/flowable?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai");
            //如果数据库中的表结构不存在就新建
            configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
    
            //构建流程引擎对象
            ProcessEngine processEngine = configuration.buildProcessEngine();
            System.out.println("processEngine = " + processEngine);
        }
    
        ProcessEngineConfiguration configuration = null;
    
    
        @Before
        public void before() {
            // 获取 ProcessEngineConfiguration 对象
            configuration = new StandaloneProcessEngineConfiguration();
    
            //配置相关的数据库连接信息
            configuration.setJdbcDriver("com.mysql.cj.jdbc.Driver");
            configuration.setJdbcUsername("xxxx");
            configuration.setJdbcPassword("xxxx");
            configuration.setJdbcUrl("jdbc:mysql://xxxxx/flowable?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai");
            //如果数据库中的表结构不存在就新建
            configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
        }
    
    
        /**
         * 部署流程
         */
        @Test
        public void testDeploy() {
            //1.获取ProcessEngine 对象
            ProcessEngine processEngine = configuration.buildProcessEngine();
            //2.获取RepositoryService
            RepositoryService repositoryService = processEngine.getRepositoryService();
            //3.完成流程部署操作
            Deployment deploy = repositoryService.createDeployment()
                    .addClasspathResource("test.bpmn20.xml") //关联要部署的流程名称
                    .name("请假流程")
                    .deploy(); //部署流程
    
    
            System.out.println("id: " + deploy.getId());
            System.out.println("name: " + deploy.getName());
            System.out.println("key: " + deploy.getKey());
    
        }
    
        /**
         * 查询部署流程的定义信息
         */
        @Test
        public void testDeployQuery() {
            ProcessEngine processEngine = configuration.buildProcessEngine();
    
            RepositoryService repositoryService = processEngine.getRepositoryService();
            //创建流程查询对象
            ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
    
            ProcessDefinition processDefinition = processDefinitionQuery.deploymentId("15001").singleResult();
    
            //部署的流程图ID,常用来做版本控制
            System.out.println("processDefinition.getDeploymentId() = " + processDefinition.getDeploymentId());
            //流程名称
            System.out.println("processDefinition.getName() = " + processDefinition.getName());
            //流程描述
            System.out.println("processDefinition.getDescription() = " + processDefinition.getDescription());
            //流程图id
            System.out.println("processDefinition.getId() = " + processDefinition.getId());
            //流程唯一标识
            System.out.println("processDefinition.getKey() = " + processDefinition.getKey());
        }
    
        /**
         * 删除部署的流程
         */
        @Test
        public void testDeleteDeploy() {
            ProcessEngine processEngine = configuration.buildProcessEngine();
            RepositoryService repositoryService = processEngine.getRepositoryService();
            //删除部署ID为1的,如果部署的流程启动了 则没法删除
    //        repositoryService.deleteDeployment("1");
            // 第二个参数是级联删除,如果流程启动了也可以进行删除,相关的任务也会被删除
            repositoryService.deleteDeployment("7501", true);
        }
    
        /**
         * 启动流程
         */
        @Test
        public void testStartProcess() {
            //id :2501
            ProcessEngine processEngine = configuration.buildProcessEngine();
            //通过runtimeService 启动流程实例
            RuntimeService runtimeService = processEngine.getRuntimeService();
    
    
            //构建流程变量
            Map<String, Object> variable = new HashMap<>();
            variable.put("employee", "张三");
            variable.put("nrOfHolidays", 3);
            variable.put("description", "感冒了");
            //启动流程实例
            ProcessInstance holidayRequest = runtimeService.startProcessInstanceByKey("test", variable);
    
            //流程实例ID
            System.out.println("holidayRequest.getProcessInstanceId() = " + holidayRequest.getProcessInstanceId());
            System.out.println("holidayRequest.getProcessDefinitionId() = " + holidayRequest.getProcessDefinitionId());
            System.out.println("holidayRequest.getActivityId() = " + holidayRequest.getActivityId());
        }
    
        /**
         * 查询代办
         */
        @Test
        public void testQueryTask() {
    
            ProcessEngine processEngine = configuration.buildProcessEngine();
    
            TaskService taskService = processEngine.getTaskService();
    
            TaskQuery taskQuery = taskService.createTaskQuery();
            List<Task> list = taskQuery.processDefinitionKey("holidayRequest")
    //                .taskAssignee("zhangsan")
                    .taskDefinitionId("test:1:15004")
                    .list();
    
            for (Task task : list) {
                System.out.println("task.getProcessDefinitionId() = " + task.getProcessDefinitionId());
                System.out.println("task.getName() = " + task.getName());
                System.out.println("task.getAssignee() = " + task.getAssignee());
                System.out.println("task.getDescription() = " + task.getDescription());
                System.out.println("task.getId() = " + task.getId());
            }
        }
    
    
        /**
         * 处理完成当前任务
         */
        @Test
        public void testCompleteTask() {
            ProcessEngine processEngine = configuration.buildProcessEngine();
    
            TaskService taskService = processEngine.getTaskService();
    
            Task task = taskService.createTaskQuery()
                    .processDefinitionKey("test")
                    .taskAssignee("zhangsan")
                    .singleResult();
    
            //创建流程变量
            HashMap<String, Object> variables = new HashMap<>();
            variables.put("approved", false);
            //完成任务
            taskService.complete(task.getId(), variables);
        }
    
    
        /**
         * 获取流程历史信息
         */
        @Test
        public void testHistory(){
            ProcessEngine processEngine = configuration.buildProcessEngine();
    
            HistoryService historyService = processEngine.getHistoryService();
    
            List<HistoricActivityInstance> list = historyService.createHistoricActivityInstanceQuery()
                    .processInstanceId("17501")
                    .finished()
                    .orderByHistoricActivityInstanceEndTime().asc()
                    .list();
    
            for (HistoricActivityInstance historicActivityInstance : list) {
    
                System.out.println("historicActivityInstance.getActivityId() = " + historicActivityInstance.getActivityId());
                System.out.println("historicActivityInstance.getActivityName() = " + historicActivityInstance.getActivityName());
                System.out.println("historicActivityInstance.getTaskId() = " + historicActivityInstance.getTaskId());
                System.out.println("historicActivityInstance.getAssignee() = " + historicActivityInstance.getAssignee());
                System.out.println("historicActivityInstance.getDeleteReason() = " + historicActivityInstance.getDeleteReason());
                System.out.println("处理时间:historicActivityInstance.getDurationInMillis() = " + historicActivityInstance.getDurationInMillis());
                System.out.println("------------------");
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201

    三、flowable流程图

    • 新建一个xml文件命名为:holiday-request.bpmn20.xml
    
    <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                 xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
                 xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC"
                 xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI"
                 xmlns:flowable="http://flowable.org/bpmn"
                 typeLanguage="http://www.w3.org/2001/XMLSchema"
                 expressionLanguage="http://www.w3.org/1999/XPath"
                 targetNamespace="http://www.flowable.org/processdef">
    	  
        <process id="holidayRequest" name="qingjia" isExecutable="true">
           
            <startEvent id="startEvent"/>
             
            <sequenceFlow sourceRef="startEvent" targetRef="approveTask"/>
             
            <userTask id="approveTask" name="tongyi or reject" flowable:assignee="zhangsan"/>
            <sequenceFlow sourceRef="approveTask" targetRef="decision"/>
            
            <exclusiveGateway id="decision"/>
            <sequenceFlow sourceRef="decision" targetRef="externalSystemCall">
                <conditionExpression xsi:type="tFormalExpression">
                    
                conditionExpression>
            sequenceFlow>
            <sequenceFlow sourceRef="decision" targetRef="sendRejectionMail">
                <conditionExpression xsi:type="tFormalExpression">
                    
                conditionExpression>
            sequenceFlow>
    
            <serviceTask id="externalSystemCall" name="Enter holidays in external system"
                         flowable:class="org.flowable.CallExternalSystemDelegate"/>
            <sequenceFlow sourceRef="externalSystemCall" targetRef="holidayApprovedTask"/>
    
            <userTask id="holidayApprovedTask" name="Holiday approved"/>
            <sequenceFlow sourceRef="holidayApprovedTask" targetRef="approveEnd"/>
    
            <serviceTask id="sendRejectionMail" name="Send out rejection email"
                         flowable:class="org.flowable.SendRejectionMail"/>
            <sequenceFlow sourceRef="sendRejectionMail" targetRef="rejectEnd"/>
    
            <endEvent id="approveEnd"/>
    
            <endEvent id="rejectEnd"/>
        process>
    
    definitions>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    以上简单介绍springboot整合flowable,后续会继续深入研究,欢迎各位小伙伴指点不足。

  • 相关阅读:
    日志中打印统计信息的方案
    二叉树 | 迭代遍历 | leecode刷题笔记
    大前端 - UniAPP
    Nvm任意切换node版本号
    DNS劫持案列
    IO流:java中解码和编码出现乱码说明及代码实现
    机器学习中的数学基础(二)
    Java:jackson实现json缩进美化输出
    Java并发编程学习7-阻塞队列
    创建 Edge 浏览器扩展教程(下)
  • 原文地址:https://blog.csdn.net/qq_40409260/article/details/132819289