快捷搜索:  汽车  科技

flowable源码解读(一篇文章掌握Flowable核心流程操作的本质)

flowable源码解读(一篇文章掌握Flowable核心流程操作的本质)  部署的流程默认的状态为激活,如果我们暂时不想使用该定义的流程,那么可以挂起该流程。当然该流程定义下边所有的流程实例全部暂停。业务流程定义数据表。此表和ACT_RE_DEPLOYMENT是多对一的关系,即,一个部署的bar包里可能包含多个流程定义文件,每个流程定义文件都会有一条记录在ACT_REPROCDEF表内,每个流程定义的数据,都会对于ACT_GE_BYTEARRAY表内的一个资源文件和PNG图片文件。和ACT_GE_BYTEARRAY的关联是通过程序用ACT_GE_BYTEARRAY.NAME与ACT_RE_PROCDEF.NAME_完成的部署ID表:act_re_deployment流程表:act_re_procdef注意:

flowable源码解读(一篇文章掌握Flowable核心流程操作的本质)(1)

在这里插入图片描述

Flowable完成流程操作1.流程部署详解1.1 部署实现

  我们先来看下流程部署的具体过程。代码实现

/** * 部署流程 */ @Test public void test3(){ ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); RepositoryService repositoryService = processEngine.getRepositoryService(); Deployment deploy = repositoryService.createDeployment() .addClasspathResource("holiday-request-new.bpmn20.xml") .name("请假流程...") .category("请假") // 分类 .tenantId("dpb") // 租户id .deploy(); System.out.println("deploy.getId() = " deploy.getId()); System.out.println("deploy.getName() = " deploy.getName()); System.out.println("deploy.getCategory() = " deploy.getCategory()); } 1.2 部署涉及表结构

涉及到的三张表:

部署资源表:act_ge_bytearray

flowable源码解读(一篇文章掌握Flowable核心流程操作的本质)(2)

部署ID表:act_re_deployment

flowable源码解读(一篇文章掌握Flowable核心流程操作的本质)(3)

流程表:act_re_procdef

flowable源码解读(一篇文章掌握Flowable核心流程操作的本质)(4)

注意:

业务流程定义数据表。此表和ACT_RE_DEPLOYMENT是多对一的关系,即,一个部署的bar包里可能包含多个流程定义文件,每个流程定义文件都会有一条记录在ACT_REPROCDEF表内,每个流程定义的数据,都会对于ACT_GE_BYTEARRAY表内的一个资源文件和PNG图片文件。和ACT_GE_BYTEARRAY的关联是通过程序用ACT_GE_BYTEARRAY.NAME与ACT_RE_PROCDEF.NAME_完成的

1.3 挂起和激活

  部署的流程默认的状态为激活,如果我们暂时不想使用该定义的流程,那么可以挂起该流程。当然该流程定义下边所有的流程实例全部暂停。

流程定义为挂起状态,该流程定义将不允许启动新的流程实例,同时该流程定义下的所有的流程实例都将全部挂起暂停执行。

/** * 挂起流程 */ @Test public void test05(){ // 获取流程引擎对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); RepositoryService repositoryService = processEngine.getRepositoryService(); ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() .processDefinitionId("holiday:1:4") .singleResult(); // 获取流程定义的状态 boolean suspended = processDefinition.isSuspended(); System.out.println("suspended = " suspended); if(suspended){ // 表示被挂起 System.out.println("激活流程定义"); repositoryService.activateProcessDefinitionById("holiday:1:4" true null); }else{ // 表示激活状态 System.out.println("挂起流程"); repositoryService.suspendProcessDefinitionById("holiday:1:4" true null); } }

具体的实现其实就是更新了流程定义表中的字段

flowable源码解读(一篇文章掌握Flowable核心流程操作的本质)(5)

而且通过REV_字段来控制数据安全,也是一种乐观锁的体现了,如果要启动一个已经挂起的流程就会出现如下的错误

flowable源码解读(一篇文章掌握Flowable核心流程操作的本质)(6)

在这里插入图片描述

2.启动流程实例

  然后我们来看看启动流程实例的过程。实现代码如下:

/** * 启动流程实例 */ @Test public void testRunProcess(){ // 获取流程引擎对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); // 启动流程实例通过 RuntimeService 对象 RuntimeService runtimeService = processEngine.getRuntimeService(); // 构建流程变量 Map<String Object> variables = new HashMap<>(); variables.put("employee" "张三") ;// 谁申请请假 variables.put("nrOfHolidays" 3); // 请几天假 variables.put("description" "工作累了,想出去玩玩"); // 请假的原因 // 启动流程实例,第一个参数是流程定义的id ProcessInstance processInstance = runtimeService .startProcessInstanceById("holiday:1:4" variables);// 启动流程实例 // 输出相关的流程实例信息 System.out.println("流程定义的ID:" processInstance.getProcessDefinitionId()); System.out.println("流程实例的ID:" processInstance.getId()); System.out.println("当前活动的ID:" processInstance.getActivityId()); }

  当我们启动了一个流程实例后,会在ACT_RU_*对应的表结构中操作 运行时实例涉及的表结构共10张:

  • ACT_RU_DEADLETTER_JOB 正在运行的任务表
  • ACT_RU_EVENT_SUBSCR 运行时事件
  • ACT_RU_EXECUTION 运行时流程执行实例
  • ACT_RU_HISTORY_JOB 历史作业表
  • ACT_RU_IDENTITYLINK 运行时用户关系信息
  • ACT_RU_JOB 运行时作业表
  • ACT_RU_SUSPENDED_JOB 暂停作业表
  • ACT_RU_TASK 运行时任务表
  • ACT_RU_TIMER_JOB 定时作业表
  • ACT_RU_VARIABLE 运行时变量表

  启动一个流程实例的时候涉及到的表有

  • ACT_RU_EXECUTION 运行时流程执行实例
  • ACT_RU_IDENTITYLINK 运行时用户关系信息
  • ACT_RU_TASK 运行时任务表
  • ACT_RU_VARIABLE 运行时变量表

ACT_RU_EXECUTION表结构

flowable源码解读(一篇文章掌握Flowable核心流程操作的本质)(7)

创建流程实例后对应的表结构的数据

flowable源码解读(一篇文章掌握Flowable核心流程操作的本质)(8)

flowable源码解读(一篇文章掌握Flowable核心流程操作的本质)(9)

在这里插入图片描述

ACT_RU_TASK 运行时任务表

flowable源码解读(一篇文章掌握Flowable核心流程操作的本质)(10)

创建流程实例后对应的表结构的数据

flowable源码解读(一篇文章掌握Flowable核心流程操作的本质)(11)

在这里插入图片描述

flowable源码解读(一篇文章掌握Flowable核心流程操作的本质)(12)

在这里插入图片描述

ACT_RU_VARIABLE 运行时变量表

flowable源码解读(一篇文章掌握Flowable核心流程操作的本质)(13)

创建流程实例后对应的表结构的数据

flowable源码解读(一篇文章掌握Flowable核心流程操作的本质)(14)

在这里插入图片描述

flowable源码解读(一篇文章掌握Flowable核心流程操作的本质)(15)

在这里插入图片描述

ACT_RU_IDENTITYLINK 运行时用户关系信息

flowable源码解读(一篇文章掌握Flowable核心流程操作的本质)(16)

创建流程实例后对应的表结构的数据:

flowable源码解读(一篇文章掌握Flowable核心流程操作的本质)(17)

在这里插入图片描述

3.处理流程

  上面的流程已经流转到了zhangsan这个用户这里,然后可以开始审批了

// 获取流程引擎对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); TaskService taskService = processEngine.getTaskService(); Task task = taskService.createTaskQuery() .processDefinitionId("holiday:1:4") .taskAssignee("zhangsan") .singleResult(); // 添加流程变量 Map<String Object> variables = new HashMap<>(); variables.put("approved" false); // 拒绝请假 // 完成任务 taskService.complete(task.getId() variables);

  在正常处理流程中涉及到的表结构

  • ACT_RU_EXECUTION 运行时流程执行实例
  • ACT_RU_IDENTITYLINK 运行时用户关系信息
  • ACT_RU_TASK 运行时任务表
  • ACT_RU_VARIABLE 运行时变量表

ACT_RU_TASK 运行时任务表 :会新生成一条记录

flowable源码解读(一篇文章掌握Flowable核心流程操作的本质)(18)

在这里插入图片描述

flowable源码解读(一篇文章掌握Flowable核心流程操作的本质)(19)

在这里插入图片描述

ACT_RU_VARIABLE 运行时变量表:会记录新的流程变量

flowable源码解读(一篇文章掌握Flowable核心流程操作的本质)(20)

在这里插入图片描述

当然流程实例也可以挂起

// 1.获取ProcessEngine对象 ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); // 2.获取RuntimeService RuntimeService runtimeService = engine.getRuntimeService(); // 3.获取流程实例对象 ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() .processInstanceId("25001") .singleResult(); // 4.获取相关的状态操作 boolean suspended = processInstance.isSuspended(); String id = processInstance.getId(); if(suspended){ // 挂起--》激活 runtimeService.activateProcessInstanceById(id); System.out.println("流程定义:" id ",已激活"); }else{ // 激活--》挂起 runtimeService.suspendProcessInstanceById(id); System.out.println("流程定义:" id ",已挂起"); }

启动第二个流程实例后再查看相关的表结构时,对他们的关系理解会更加的清楚一些

启动一个新的流程实例对应的就会产生两条记录

flowable源码解读(一篇文章掌握Flowable核心流程操作的本质)(21)

在这里插入图片描述

IDENTITYLINK中会记录每次流程操作的信息

flowable源码解读(一篇文章掌握Flowable核心流程操作的本质)(22)

在这里插入图片描述

flowable源码解读(一篇文章掌握Flowable核心流程操作的本质)(23)

在这里插入图片描述

流程变量数据,及时key 相同,但是属于不同的流程实例相互间也是隔离的

flowable源码解读(一篇文章掌握Flowable核心流程操作的本质)(24)

在这里插入图片描述

4.完成一个流程

  然后我们把第一个流程处理完成

ProcessEngine processEngine = cfg.buildProcessEngine(); TaskService taskService = processEngine.getTaskService(); Task task = taskService.createTaskQuery() .processDefinitionId("holiday:1:4") .taskAssignee("lisi") .singleResult(); // 添加流程变量 Map<String Object> variables = new HashMap<>(); variables.put("approved" false); // 拒绝请假 // 完成任务 taskService.complete(task.getId() variables);

处理完了一个工作流程后,我们来看看相关的表结构信息

首先我们会发现

  • ACT_RU_EXECUTION 运行时流程执行实例
  • ACT_RU_IDENTITYLINK 运行时用户关系信息
  • ACT_RU_TASK 运行时任务表
  • ACT_RU_VARIABLE 运行时变量表

这四张表中对应的数据都没有了,也就是这个流程已经不是运行中的流程了。然后在对应的历史表中我们可以看到相关的信息

  • ACT_HI_ACTINST 历史的流程实例
  • ACT_HI_ATTACHMENT 历史的流程附件
  • ACT_HI_COMMENT 历史的说明性信息
  • ACT_HI_DETAIL 历史的流程运行中的细节信息
  • ACT_HI_IDENTITYLINK 历史的流程运行过程中用户关系
  • ACT_HI_PROCINST 历史的流程实例
  • ACT_HI_TASKINST 历史的任务实例
  • ACT_HI_VARINST 历史的流程运行中的变量信息

在我们上面的处理流程的过程中设计到的历史表有

ACT_HI_ACTINST 历史的流程实例

flowable源码解读(一篇文章掌握Flowable核心流程操作的本质)(25)

flowable源码解读(一篇文章掌握Flowable核心流程操作的本质)(26)

flowable源码解读(一篇文章掌握Flowable核心流程操作的本质)(27)

ACT_HI_IDENTITYLINK 历史的流程运行过程中用户关系

flowable源码解读(一篇文章掌握Flowable核心流程操作的本质)(28)

flowable源码解读(一篇文章掌握Flowable核心流程操作的本质)(29)

在这里插入图片描述

ACT_HI_PROCINST 历史的流程实例

flowable源码解读(一篇文章掌握Flowable核心流程操作的本质)(30)

flowable源码解读(一篇文章掌握Flowable核心流程操作的本质)(31)

在这里插入图片描述

flowable源码解读(一篇文章掌握Flowable核心流程操作的本质)(32)

在这里插入图片描述

ACT_HI_TASKINST 历史的任务实例

flowable源码解读(一篇文章掌握Flowable核心流程操作的本质)(33)

flowable源码解读(一篇文章掌握Flowable核心流程操作的本质)(34)

flowable源码解读(一篇文章掌握Flowable核心流程操作的本质)(35)

ACT_HI_VARINST 历史的流程运行中的变量信息:流程变量虽然在任务完成后在流程实例表中会删除,但是在历史表中还是会记录的

flowable源码解读(一篇文章掌握Flowable核心流程操作的本质)(36)

flowable源码解读(一篇文章掌握Flowable核心流程操作的本质)(37)

在这里插入图片描述

好了一个相对简单的流程处理涉及到的相关表结构内容就介绍完了

猜您喜欢: