1. 流程生命周期与数据库表之间的逻辑关系

2. Flowable流程对象之间关系

3. act_ru_execution详解
ACTIVITI ACT_RU_EXECUTION 表

这个表是工作流程的核心表,流程的驱动都和合格表有密切的关系。

一般来讲一个流程实例都有一条主线。如果流程为直线流程,那么流程实例在这个表中只有一条记录对应。

ID_:EXECUTION主键,这个主键有可能和PROC_INST_ID_相同,相同的情况表示这条记录为主实例记录。

REV_:表示数据库表更新次数。

PROC_INST_ID_:一个流程实例不管有多少条分支实例,这个ID都是一致的。
比如以下流程:

这个对应的EXECUTION数据为:

这个图就描述的很清楚了。
10000001020315 记录为主流程,实例ID都为10000001020315,分支流程实例的父ID为10000001020315。

BUSINESS_KEY_:这个为业务主键,主流程才会使用业务主键,另外这个业务主键字段在表中有唯一约束。

PARENT_ID_:这个记录表示父实例ID,如上图,同步节点会产生两条执行记录,这两条记录的父ID为主线的ID。

PROC_DEF_ID_ :流程定义ID

SUPER_EXEC : 这个如果存在表示这个实例记录为一个外部子流程记录,对应主流程的主键ID。

ACT_ID_:表示流程运行到的节点,如上图主实例运行到ANDGateway1 节点。

两个子实例运行到UserTask1,UserTask2节点。

IS_ACTIVE_ : 是否活动流程实例,比如上图,主流程为非活动实例,下面两个为活动实例,如果UserTask2完成,那么这个值将变为0即非活动。

IS_CONCURRENT_:是否并发。上图同步节点后为并发,如果是并发多实例也是为1。

IS_SCOPE_: 这个字段我跟踪了一下不同的流程实例,如会签,子流程,同步等情况,发现主实例的情况这个字段为1,子实例这个字段为0。

TENANT_ID_ : 这个字段表示租户ID。可以应对多租户的设计。

IS_EVENT_SCOPE: 没有使用到事件的情况下,一般都为0。

SUSPENSION_STATE_: 这个表示是否暂停。

总结:
(1)如果是单例流程,执行对象ID就是流程实例ID
(2)如果一个流程有分支和聚合,那么执行对象ID和流程实例ID就不相同
(3)一个流程中,流程实例只有1个,执行对象可以存在多个。

4. Activiti业务键(businessKey)
问题:如何让业务对象和对应的流程 关联?

发现ProcessInstance 有个方法getBusinessKey()可以得到一个businessKey。

ProcessInstance 对应数据库中的表act_ru_execution有个字段BUSINESS_KEY_对应类中的businessKey,这个字段在创建表时自动被设置为unique

解决:

1、保证流程的ID和业务对象的类名一致。例如:流程id为LeaveBill,我们的业务对象的类名也创建为LeaveBill。

2、在流程启动的时候获取业务对象执行方法的时候传入businessKey,workflowService.startProcess(key,businessKey,vars);(这里vars为一些变量根据实际情况可有可无)businessKey 产生规则: className+“.”+objId

    public void startProcess(Long id) {//1. 获取业务对象LeaveBill bill = this.get(id);if(bill!=null){// 修改业务对象状态bill.setState(1);// 请假单状态 0初始录入,1.开始审批,2为审批通过this.update(bill);//2. 添加流程变量(Map)Map<String,Object> vars = new HashMap<>();vars.put("inputUser", bill.getUser().getName());// 添加变量来描述业务对象的信息String classType =bill.getClass().getSimpleName();vars.put("classType", classType);vars.put("objId", bill.getId());//3. 启动流程// 获取流程定义keyString key = classType;// 获取业务键 产生规则: className+“.”+objIdString businessKey = classType +"." + bill.getId();this.workflowService.startProcess(key,businessKey,vars);}}

3、根据以下方法就可以用taskId获取业务对象id

public String getBusinessObjId(String taskId) {//1  获取任务对象Task task  =  taskService.createTaskQuery().taskId(taskId).singleResult();//2  通过任务对象获取流程实例ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult();//3 通过流程实例获取“业务键”String businessKey = pi.getBusinessKey();//4 拆分业务键,拆分成“业务对象名称”和“业务对象ID”的数组 // a=b  LeaveBill.1String objId = null;if(StringUtils.isNotBlank(businessKey)){objId = businessKey.split("\\.")[1];}return objId;}

4、根据业务键获取流程实例和任务

ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceBusinessKey("LeaveBill.1").singleResult();
List<Task> task = taskService.createTaskQuery().processInstanceBusinessKey("LeaveBill.1").list();

看完这个就会Flowable了相关推荐

  1. 电脑总有安装计算机更新,为什么我们的电脑总会莫名的安装垃圾软件,看完吓一跳,欢迎关注...

    现在电脑已经走进了我们的生活,很多人都已经接触电脑了,然而对于电脑的使用,我们除了知道那些最常见的使用方式之外,大多数人对电脑的其他功能任然是一无所知,当然学习电脑专业和IT的除外了,很多人应该都会发 ...

  2. 据说看完这21个故事的人,30岁前都成了亿万富翁。你是下一个吗?

    1.甲去买烟,烟29元,但他没火柴,跟店员说:"顺便送一盒火柴吧."店员没给. 乙去买烟,烟29元,他也没火柴,跟店员说:"便宜一毛吧."最后,他用这一毛买一盒 ...

  3. 200字带你看完一本书,GPT-3已经会给长篇小说写摘要了

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 文 | 博雯 源 | 量子位 现在,AI能帮你200字看完一段12万 ...

  4. 苹果12 Pro Max和mini测评来了,看完我选择了iPhone 12

    萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI -iPhone 12 Pro Max和iPhone 12 mini,现在开售了. 不过这两款手机,媒体评价究竟如何? 来自The Verge ...

  5. 一道看完答案你会觉得很沙雕的「动态规划算法题」

    这道算法题其实并不难,如果你把文章从头到尾看完的话基本上能看懂,但如果你看到最后的话大概率会说一句:这是什么沙雕题目?! 题目来源于 LeetCode 第 877 号问题:石子游戏. 为了更好理解,我 ...

  6. Spring经常出现的报错原因,看完保证你技术涨一层!

    在我们开发中经常会遇到很多关于Spring启动报错的问题,我司在整合几十个老系统的时候也经常出现这样的问题,而这样的场景在大一点的公司会经常出现,比如给你个任务,你整合下几个遗留系统,有几十个甚至几百 ...

  7. 深度剖析:Redis分布式锁到底安全吗?看完这篇文章彻底懂了!

    ‍‍‍‍‍‍‍‍‍‍‍‍阅读本文大约需要 20 分钟. 大家好,我是 Kaito. 这篇文章我想和你聊一聊,关于 Redis 分布式锁的「安全性」问题. Redis 分布式锁的话题,很多文章已经写烂了 ...

  8. 看完这篇 JVM 垃圾回收,和面试官扯皮没问题了

    本文来源:码海 前言 Java 相比 C/C++ 最显著的特点便是引入了自动垃圾回收 (下文统一用 GC 指代自动垃圾回收),它解决了 C/C++ 最令人头疼的内存管理问题,让程序员专注于程序本身,不 ...

  9. 看完弄懂,明年至少加 5K

    看完弄懂,明年至少加 5K

最新文章

  1. QT:(4)解决在VS15下配置QT后没有QT GUI Application选项
  2. pyaudio:基于pyaudio利用Python编程从电脑端录制音频保存到指定文件夹+将录音上传服务器+录音进行识别并转为文本保存
  3. Intel Realsense D435 Realsense View 错误 RT IC2 Config error
  4. android 虚拟按键 增减和删除的方法
  5. Java Virtual Machine Stacks(虚拟机栈)
  6. struts2上传文件类型限制
  7. 三分钟快速理解javascript内存管理
  8. Win10彻底关闭Antimalware Service Executable占用内存过高问题
  9. NSURLSession访问HTTPS网站
  10. 微服务化的基石--持续集成
  11. 3D LUT Creator Pro for Mac(专业调色软件)中文版
  12. oracle监听启动接着关闭,Oracle监听启动后自动关闭
  13. WordPress热门网站主题汇总(长期更新)
  14. x4无法在此计算机上安装,错误写入注册表键_cdrx4安装提示不能将数值写入键_错误写入注册表键...
  15. 系统wmi服务器,wmi的服务器实时监控系统
  16. Chrome打不开baidu首页的问题
  17. 用SQL来校验证件号码是否合法
  18. 每当我夜深人静的时候下载小电影,总是会卡在百分之九十九,这是正义的制裁么?
  19. 树莓派Web登录校园网WIFI热点DJTU
  20. _variant_t数据类型

热门文章

  1. AC97,i2S,HD-AUDIO接口的声卡,输出是什么?
  2. 如何更优雅的使用 Java8 进行分组(尤其是多个字段的组合分组)。
  3. Spring源码分析2 — 容器启动流程
  4. 如何用matlab画三维函数相交,如何用matlab绘制三元函数f=x^2 y^3 z^4在
  5. 组合数学 —— 斯特林数(Stirling)
  6. MySql配置参数详解
  7. 《MATLAB神经网络案例分析》学习(一)——BP神经网络基本理论
  8. ProSpec ALDH2 人重组体解决方案
  9. vs单步调试及断点调试基本介绍(入门版详细图文介绍)
  10. 新加坡php工资,2020年新加坡工资预测:每月或涨到3万人民币