看完这个就会Flowable了
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了相关推荐
- 电脑总有安装计算机更新,为什么我们的电脑总会莫名的安装垃圾软件,看完吓一跳,欢迎关注...
现在电脑已经走进了我们的生活,很多人都已经接触电脑了,然而对于电脑的使用,我们除了知道那些最常见的使用方式之外,大多数人对电脑的其他功能任然是一无所知,当然学习电脑专业和IT的除外了,很多人应该都会发 ...
- 据说看完这21个故事的人,30岁前都成了亿万富翁。你是下一个吗?
1.甲去买烟,烟29元,但他没火柴,跟店员说:"顺便送一盒火柴吧."店员没给. 乙去买烟,烟29元,他也没火柴,跟店员说:"便宜一毛吧."最后,他用这一毛买一盒 ...
- 200字带你看完一本书,GPT-3已经会给长篇小说写摘要了
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 文 | 博雯 源 | 量子位 现在,AI能帮你200字看完一段12万 ...
- 苹果12 Pro Max和mini测评来了,看完我选择了iPhone 12
萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI -iPhone 12 Pro Max和iPhone 12 mini,现在开售了. 不过这两款手机,媒体评价究竟如何? 来自The Verge ...
- 一道看完答案你会觉得很沙雕的「动态规划算法题」
这道算法题其实并不难,如果你把文章从头到尾看完的话基本上能看懂,但如果你看到最后的话大概率会说一句:这是什么沙雕题目?! 题目来源于 LeetCode 第 877 号问题:石子游戏. 为了更好理解,我 ...
- Spring经常出现的报错原因,看完保证你技术涨一层!
在我们开发中经常会遇到很多关于Spring启动报错的问题,我司在整合几十个老系统的时候也经常出现这样的问题,而这样的场景在大一点的公司会经常出现,比如给你个任务,你整合下几个遗留系统,有几十个甚至几百 ...
- 深度剖析:Redis分布式锁到底安全吗?看完这篇文章彻底懂了!
阅读本文大约需要 20 分钟. 大家好,我是 Kaito. 这篇文章我想和你聊一聊,关于 Redis 分布式锁的「安全性」问题. Redis 分布式锁的话题,很多文章已经写烂了 ...
- 看完这篇 JVM 垃圾回收,和面试官扯皮没问题了
本文来源:码海 前言 Java 相比 C/C++ 最显著的特点便是引入了自动垃圾回收 (下文统一用 GC 指代自动垃圾回收),它解决了 C/C++ 最令人头疼的内存管理问题,让程序员专注于程序本身,不 ...
- 看完弄懂,明年至少加 5K
看完弄懂,明年至少加 5K
最新文章
- QT:(4)解决在VS15下配置QT后没有QT GUI Application选项
- pyaudio:基于pyaudio利用Python编程从电脑端录制音频保存到指定文件夹+将录音上传服务器+录音进行识别并转为文本保存
- Intel Realsense D435 Realsense View 错误 RT IC2 Config error
- android 虚拟按键 增减和删除的方法
- Java Virtual Machine Stacks(虚拟机栈)
- struts2上传文件类型限制
- 三分钟快速理解javascript内存管理
- Win10彻底关闭Antimalware Service Executable占用内存过高问题
- NSURLSession访问HTTPS网站
- 微服务化的基石--持续集成
- 3D LUT Creator Pro for Mac(专业调色软件)中文版
- oracle监听启动接着关闭,Oracle监听启动后自动关闭
- WordPress热门网站主题汇总(长期更新)
- x4无法在此计算机上安装,错误写入注册表键_cdrx4安装提示不能将数值写入键_错误写入注册表键...
- 系统wmi服务器,wmi的服务器实时监控系统
- Chrome打不开baidu首页的问题
- 用SQL来校验证件号码是否合法
- 每当我夜深人静的时候下载小电影,总是会卡在百分之九十九,这是正义的制裁么?
- 树莓派Web登录校园网WIFI热点DJTU
- _variant_t数据类型
热门文章
- AC97,i2S,HD-AUDIO接口的声卡,输出是什么?
- 如何更优雅的使用 Java8 进行分组(尤其是多个字段的组合分组)。
- Spring源码分析2 — 容器启动流程
- 如何用matlab画三维函数相交,如何用matlab绘制三元函数f=x^2 y^3 z^4在
- 组合数学 —— 斯特林数(Stirling)
- MySql配置参数详解
- 《MATLAB神经网络案例分析》学习(一)——BP神经网络基本理论
- ProSpec ALDH2 人重组体解决方案
- vs单步调试及断点调试基本介绍(入门版详细图文介绍)
- 新加坡php工资,2020年新加坡工资预测:每月或涨到3万人民币