Activiti工作流内建数据库表分析

image.png

如上图所示:activiti 5.22.0 版内建25张表,下面我将简要分析下这些表的作用。
1、表分类浅析
activiti的表主要分为以下几类:

1)通用数据表(2个)
act_ge_bytearray:二进制数据表,如流程定义、流程模板、流程图的字节流文件;
act_ge_property:属性数据表(不常用);
2)历史表(8个,HistoryService接口操作的表)
act_hi_actinst:历史节点表,存放流程实例运转的各个节点信息(包含开始、结束等非任务节点);
act_hi_attachment:历史附件表,存放历史节点上传的附件信息(不常用);
act_hi_comment:历史意见表,可改造用于保存节点审批意见、备注;
act_hi_detail:历史详情表,存储节点运转的一些信息(不常用);
act_hi_identitylink:历史流程人员表,存储流程各节点候选、办理人员信息,常用于查询某人或部门的已办任务;
act_hi_procinst:历史流程实例表,存储流程实例历史数据(包含正在运行的流程实例);
act_hi_taskinst:历史流程任务表,存储历史任务节点;
act_hi_varinst:流程历史变量表,存储流程历史节点的变量信息;
3)用户相关表(4个,IdentityService接口操作的表)
act_id_group:用户组信息表,对应节点选定候选组信息;
act_id_info:用户扩展信息表,存储用户扩展信息;
act_id_membership:用户与用户组关系表;
act_id_user:用户信息表,对应节点选定办理人或候选人信息;
4)流程定义、流程模板相关表(3个,RepositoryService接口操作的表)
act_re_deployment:部属信息表,存储流程定义、模板部署信息;
act_re_procdef:流程定义信息表,存储流程定义相关描述信息,但其真正内容存储在act_ge_bytearray表中,以字节形式存储;
act_re_model:流程模板信息表,存储流程模板相关描述信息,但其真正内容存储在act_ge_bytearray表中,以字节形式存储;
5)流程运行时表(6个,RuntimeService接口操作的表)
act_ru_task:运行时流程任务节点表,存储运行中流程的任务节点信息,重要,常用于查询人员或部门的待办任务时使用;
act_ru_event_subscr:监听信息表,不常用;
act_ru_execution:运行时流程执行实例表,记录运行中流程运行的各个分支信息(当没有子流程时,其数据与act_ru_task表数据是一一对应的);
act_ru_identitylink:运行时流程人员表,重要,常用于查询人员或部门的待办任务时使用;
act_ru_job:运行时定时任务数据表,存储流程的定时任务信息;
act_ru_variable:运行时流程变量数据表,存储运行中的流程各节点的变量信息;
6)其他(2个)
act_evt_log:事件日志表,不常用;
act_procdef_info:流程定义扩展表,不常用;

总结如下:
ACT_RE_: 'RE'表示repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。
ACT_RU_
: 'RU'表示runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。
ACT_ID_: 'ID'表示identity。 这些表包含身份信息,比如用户,组等等。
ACT_HI_
: 'HI'表示history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。
ACT_GE_*: 通用数据, 用于不同场景下,如存放资源文件。
2、流程定义与流程模板
activiti中的流程定义大致有以下2中方式生成:

1、由流程定义文件(即bpmn/xml文件,通常可通过eclipse的插件绘制生成)直接部署生成流程定义;
2、由模板文件转换部署而成;
详细编码请参考我的这篇文章:Activiti流程相关功能详解
需要注意的是,流程定义在部署时,是根据流程定义的key来区分是否是同一种流程,因此key相同的流程定义相继部署时,会生成该key对应的新版本的流程定义。

image.png

流程定义的key:zjjr-core-invite-chain:1:3597516
规则:流程的key:版本号:ID

而工作流中的流程模板也可由2种方式形成:

1、新建模板信息,然后利用activiti的模板设计工具(web页面)绘制后保存生成;
2、由流程定义文件(bpmn/xml)转换生成;
详情编码请参考我的这篇文章:Activiti模板相关功能详解

3、流程实例
啥叫流程实例?它与流程定义有何区别与联系呢?下面举个栗子:

流程定义好比我们的Java类,而流程实例就像由Java类生成的Java对象,因此,一个流程定义可以生成多个流程实例;而工作流的运转就是在流程实例的各个节点之间进行运转。

4、流程运转机制
1)启动流程
方法一:

ProcessInstance startProcessInstanceById(String processDefinitionId, String businessKey, Map<String, Object> var3);

方法二:

ProcessInstance submitStartFormData(String processDefinitionId, String businessKey, Map<String, String> properties)

一般用第一种,如果使用的是动态表单,选用第二种;
传入参数均为需要启动的流程定义ID、业务主键ID、启动参数;

【注】
1、启动参数通常包含办理的用户ID、网关条件值(可选),以及节点中自定义的变量值。
2、启动流程后,通常要往这几张表写入数据:act_ru_execution、act_ru_identitylink、act_ru_task、act_ru_variable、act_hi_actinst、act_hi_identitylink、act_hi_procinst、act_hi_taskinst、act_hi_varinst;

2)办理流程
Activiti在办理时默认有个认领任务的机制,比如某个任务节点同时配置了2个候选人办理,则其中一人认领后,另一个候选人则不能办理了;认领接口如下:

void claim(String taskId, String userId)

传入任务ID和用户ID即可认领(会校验该任务是否已被认领,如果已被认领,则去校验认领人和当前传入的用户是否一致,否则报错),源码如下:

protected Void execute(CommandContext commandContext, TaskEntity task) {
        if (this.userId != null) {
            if (task.getAssignee() != null) {
                if (!task.getAssignee().equals(this.userId)) {
                    throw new ActivitiTaskAlreadyClaimedException(task.getId(), task.getAssignee());
                }
            } else {
                task.setAssignee(this.userId, true, true);
            }
        } else {
            task.setAssignee((String)null, true, true);
        }

        commandContext.getHistoryManager().recordTaskClaim(this.taskId);
        return null;
    }

当然也可以去掉认领这个步骤,即只要这个任务还没被其中一个候选人办理,那么无论哪个候选人都可以办理,但一旦被其中一人办理,这个任务就办理结束,流程自动流转到下一个节点;办理时代码如下:

// 办理流程
taskService.setAssignee(task.getId(), in.getUserId().toString());
taskService.complete(task.getId(), in.getVariables());

setAssignee作用是将办理该用流程的用户信息记录到act_ru_identitylink、act_hi_identitylink表中。

Activiti的运行表和历史表在流程运行时是同步记录数据的,当流程实例结束时,会删除运行表种的数据,保留历史表中的数据。

在有网关节点时,办理任务需要额外传入网关条件参数,指引工作流正确运转到下一个节点(网关条件对应具体的连接线):

image.png

如上图,在办理该节点时,需传入参数"wayType",值为1时流程运转至该连接线!
5、流程配置
1)节点办理人、候选人、候选组
可以将工作流对接至自定义的数据库用户、角色信息表,具体方法请参考我的这篇文章:Activiti对接业务表实现自定义用户和用户组
对接成功后可以改造流程设计器的选定用户、用户组界面,实现如下效果:
image.png

可以直接点击选择节点的办理人、候选人、候选组;
至此,我对工作流的一些常见知识做了初步总结,希望对读者有帮助!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,932评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,554评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,894评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,442评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,347评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,899评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,325评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,980评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,196评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,163评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,085评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,826评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,389评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,501评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,753评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,171评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,616评论 2 339

推荐阅读更多精彩内容