在activiti中有几个概念常常用,但文档也没有讲的很清楚,若是不理解,有可能会误用。本文就详细探讨如下几个概念java
咱们在前面章节讲过,bpmn流程模型文件须要经过RepositoryService
进行发布,相同名称的流程模型从新部署后会升一个版本,但并不影响以前的流程,还未结束的流程仍是会按照发起时候的版本走。所以deployment就表示一次资源的部署,资源类型不必定是bpmn文件,能够是任意文件。上传的资源元信息保存在ACT_RE_DEPLOYMENT
中,资源内容以二进制形式保存在表ACT_GE_BYTEARRAY
中,两张表经过DEPLOYMENT_ID
字段关联mysql
一个流程每发起一次就是一个实例,实例数也是流程统计的重要数据,一个流程若是有10000个实例就表示这个流程已经被发起了10000次,流程实例在activiti中是没有实体表存储的,在流程发起时系统分配一个实例id(PROC_INST_ID_
),在整个流程的流转中,该实例号都保持不变,所以能够根据PROC_INST_ID_查询整个流程运行时的数据。当调用api发起流程时,应用程序应须要把PROC_INST_ID_
保存到自身的业务表中,后续对流程的管理和追踪都须要PROC_INST_ID_,如要查询指定流程目前审批人信息,执行如下api:sql
TaskService taskService = ProcessEngines.getDefaultProcessEngine().getTaskService(); List<Task> tasks = taskService.createTaskQuery() .processInstanceId(instanceId) .list();
若是要追踪流程运行时信息,能够以PROC_INST_ID_做为过滤条件,你能够根据PROC_INST_ID_查询如下表的信息segmentfault
mysql> SELECT table_name,column_name FROM information_schema.COLUMNS where COLUMN_NAME='PROC_INST_ID_'; +-----------------------+---------------+ | TABLE_NAME | COLUMN_NAME | +-----------------------+---------------+ | ACT_EVT_LOG | PROC_INST_ID_ | | ACT_FO_SUBMITTED_FORM | PROC_INST_ID_ | | ACT_HI_ACTINST | PROC_INST_ID_ | | ACT_HI_ATTACHMENT | PROC_INST_ID_ | | ACT_HI_COMMENT | PROC_INST_ID_ | | ACT_HI_DETAIL | PROC_INST_ID_ | | ACT_HI_IDENTITYLINK | PROC_INST_ID_ | | ACT_HI_PROCINST | PROC_INST_ID_ | | ACT_HI_TASKINST | PROC_INST_ID_ | | ACT_HI_VARINST | PROC_INST_ID_ | | ACT_RU_EVENT_SUBSCR | PROC_INST_ID_ | | ACT_RU_EXECUTION | PROC_INST_ID_ | | ACT_RU_IDENTITYLINK | PROC_INST_ID_ | | ACT_RU_TASK | PROC_INST_ID_ | | ACT_RU_VARIABLE | PROC_INST_ID_ | +-----------------------+---------------+ 15 rows in set (0.01 sec)
execution是比较难理解的一个概念,官方的解释是Represent a 'path of execution' in a process instance
,表明流程实例的执行路径,有点抽象,什么意思呢,当流程没有分之,start到end就是一条直线,那么就只有一条执行路径,就是一个execution,若是流程有分之,好比平行审批,那么到平行网关就会分出两条路径,这时候就会产生两个的execution,新的execution经过PARENT_ID_
与父exection进行关联,之因此要这么设计,我以为是为了隔离不一样执行路径间数据的隔离,好比在程序分之A上定义了一个变量,程序是不知道流程是否在分之上,在分之B上又从新定义了相同的变量,若是没有execution的概念就会致使变量被覆盖。api
有一个比较特别的地方须要注意下,流程实例(ProcessInstance)也是一个execution,实例id(PROC_INST_ID_)就是流程实例在execution表上的id,从源码上也能够看出:bash
下面咱们经过两个具体例子来理解executionoop
以上就是一个简单的流程,流程发起后到001节点,001审批后到002,002审批后流程结束,经过代码进行发起,保存实例id,后续经过实例id进行观察spa
发起代码设计
public String start() { ProcessInstance instance = runtimeService.startProcessInstanceByKey("execution_simple"); return instance.getId(); }
发起后表信息code
mysql> SELECT id_,PROC_INST_ID_,PARENT_ID_,PROC_DEF_ID_,ROOT_PROC_INST_ID_,ACT_ID_ FROM activiti.ACT_RU_EXECUTION where proc_inst_id_=77508; +-------+---------------+------------+-------------------+--------------------+---------+ | id_ | PROC_INST_ID_ | PARENT_ID_ | PROC_DEF_ID_ | ROOT_PROC_INST_ID_ | ACT_ID_ | +-------+---------------+------------+-------------------+--------------------+---------+ | 77508 | 77508 | NULL | myProcess:2:77507 | 77508 | NULL | | 77509 | 77508 | 77508 | myProcess:2:77507 | 77508 | task1 | +-------+---------------+------------+-------------------+--------------------+---------+ 2 rows in set (0.01 sec) mysql> select ID_,EXECUTION_ID_,PROC_INST_ID_,PROC_DEF_ID_,NAME_,TASK_DEF_KEY_ from ACT_RU_TASK WHERE PROC_INST_ID_=77508; +-------+---------------+---------------+-------------------+-------+---------------+ | ID_ | EXECUTION_ID_ | PROC_INST_ID_ | PROC_DEF_ID_ | ASSIGNEE_ | TASK_DEF_KEY_ | +-------+---------------+---------------+-------------------+-----------+---------------+ | 77512 | 77509 | 77508 | myProcess:2:77507 | 001 | task1 | +-------+---------------+---------------+-------------------+-----------+---------------+ 1 row in set (0.00 sec)
咱们能够获得如下几个信息
001审批后表信息
mysql> SELECT id_,PROC_INST_ID_,PARENT_ID_,PROC_DEF_ID_,ROOT_PROC_INST_ID_,ACT_ID_ FROM activiti.ACT_RU_EXECUTION where proc_inst_id_=77508; +-------+---------------+------------+-------------------+--------------------+---------+ | id_ | PROC_INST_ID_ | PARENT_ID_ | PROC_DEF_ID_ | ROOT_PROC_INST_ID_ | ACT_ID_ | +-------+---------------+------------+-------------------+--------------------+---------+ | 77508 | 77508 | NULL | myProcess:2:77507 | 77508 | NULL | | 77509 | 77508 | 77508 | myProcess:2:77507 | 77508 | task2 | +-------+---------------+------------+-------------------+--------------------+---------+ 2 rows in set (0.00 sec) mysql> select ID_,EXECUTION_ID_,PROC_INST_ID_,PROC_DEF_ID_,ASSIGNEE_,TASK_DEF_KEY_ from ACT_RU_TASK WHERE PROC_INST_ID_=77508; +-------+---------------+---------------+-------------------+-------+---------------+ | ID_ | EXECUTION_ID_ | PROC_INST_ID_ | PROC_DEF_ID_ | ASSIGNEE_ | TASK_DEF_KEY_ | +-------+---------------+---------------+-------------------+-----------+---------------+ | 77515 | 77509 | 77508 | myProcess:2:77507 | 002 | task2 | +-------+---------------+---------------+-------------------+-------------+---------------+ 1 row in set (0.00 sec)
execution信息不变,由于当前流程没有分之。
流程发起
mysql> SELECT id_,PROC_INST_ID_,PARENT_ID_,PROC_DEF_ID_,ROOT_PROC_INST_ID_,ACT_ID_ FROM activiti.ACT_RU_EXECUTION where proc_inst_id_=80011; +-------+---------------+------------+-------------------------+--------------------+---------+ | id_ | PROC_INST_ID_ | PARENT_ID_ | PROC_DEF_ID_ | ROOT_PROC_INST_ID_ | ACT_ID_ | +-------+---------------+------------+-------------------------+--------------------+---------+ | 80011 | 80011 | NULL | parallelProcess:1:80009 | 80011 | NULL | | 80012 | 80011 | 80011 | parallelProcess:1:80009 | 80011 | task1 | +-------+---------------+------------+-------------------------+--------------------+---------+ 2 rows in set (0.00 sec) mysql> mysql> select ID_,EXECUTION_ID_,PROC_INST_ID_,PROC_DEF_ID_,ASSIGNEE_,TASK_DEF_KEY_ from ACT_RU_TASK WHERE PROC_INST_ID_=80011; +-------+---------------+---------------+-------------------------+-----------+---------------+ | ID_ | EXECUTION_ID_ | PROC_INST_ID_ | PROC_DEF_ID_ | ASSIGNEE_ | TASK_DEF_KEY_ | +-------+---------------+---------------+-------------------------+-----------+---------------+ | 80015 | 80012 | 80011 | parallelProcess:1:80009 | 001 | task1 | +-------+---------------+---------------+-------------------------+-----------+---------------+ 1 row in set (0.00 sec)
001审批后
mysql> SELECT id_,PROC_INST_ID_,PARENT_ID_,PROC_DEF_ID_,ROOT_PROC_INST_ID_,ACT_ID_ FROM activiti.ACT_RU_EXECUTION where proc_inst_idINST_ID_=80011; +-------+---------------+------------+-------------------------+--------------------+---------+ | id_ | PROC_INST_ID_ | PARENT_ID_ | PROC_DEF_ID_ | ROOT_PROC_INST_ID_ | ACT_ID_ | +-------+---------------+------------+-------------------------+--------------------+---------+ | 80011 | 80011 | NULL | parallelProcess:1:80009 | 80011 | NULL | | 80012 | 80011 | 80011 | parallelProcess:1:80009 | 80011 | task3 | | 80018 | 80011 | 80011 | parallelProcess:1:80009 | 80011 | task2 | +-------+---------------+------------+-------------------------+--------------------+---------+ 3 rows in set (0.00 sec) mysql> select ID_,EXECUTION_ID_,PROC_INST_ID_,PROC_DEF_ID_,ASSIGNEE_,TASK_DEF_KEY_ from ACT_RU_TASK WHERE PROC_INST_ID_=80011; +-------+---------------+---------------+-------------------------+-----------+---------------+ | ID_ | EXECUTION_ID_ | PROC_INST_ID_ | PROC_DEF_ID_ | ASSIGNEE_ | TASK_DEF_KEY_ | +-------+---------------+---------------+-------------------------+-----------+---------------+ | 80020 | 80012 | 80011 | parallelProcess:1:80009 | 003 | task3 | | 80023 | 80018 | 80011 | parallelProcess:1:80009 | 002 | task2 | +-------+---------------+---------------+-------------------------+-----------+---------------+ 2 rows in set (0.00 sec)
能够看出80018是新建立的execution,task3复用了原来的exection 80012,两个execution的父id都是80011,也就是流程实例execution。
003审批后
mysql> SELECT id_,PROC_INST_ID_,PARENT_ID_,PROC_DEF_ID_,ROOT_PROC_INST_ID_,ACT_ID_ FROM activiti.ACT_RU_EXECUTION where proc_inst_id_=80011; +-------+---------------+------------+-------------------------+--------------------+------------------+ | id_ | PROC_INST_ID_ | PARENT_ID_ | PROC_DEF_ID_ | ROOT_PROC_INST_ID_ | ACT_ID_ | +-------+---------------+------------+-------------------------+--------------------+------------------+ | 80011 | 80011 | NULL | parallelProcess:1:80009 | 80011 | NULL | | 80012 | 80011 | 80011 | parallelProcess:1:80009 | 80011 | parallelgateway2 | | 80018 | 80011 | 80011 | parallelProcess:1:80009 | 80011 | task2 | +-------+---------------+------------+-------------------------+--------------------+------------------+ 3 rows in set (0.00 sec) mysql> select ID_,EXECUTION_ID_,PROC_INST_ID_,PROC_DEF_ID_,ASSIGNEE_,TASK_DEF_KEY_ from ACT_RU_TASK WHERE PROC_INST_ID_=80011; +-------+---------------+---------------+-------------------------+-----------+---------------+ | ID_ | EXECUTION_ID_ | PROC_INST_ID_ | PROC_DEF_ID_ | ASSIGNEE_ | TASK_DEF_KEY_ | +-------+---------------+---------------+-------------------------+-----------+---------------+ | 80023 | 80018 | 80011 | parallelProcess:1:80009 | 002 | task2 | +-------+---------------+---------------+-------------------------+-----------+---------------+ 1 row in set (0.00 sec)
80012停留在parallelgateway2
上等待80018结束,没有新的execution产生
002审批后
mysql> SELECT id_,PROC_INST_ID_,PARENT_ID_,PROC_DEF_ID_,ROOT_PROC_INST_ID_,ACT_ID_ FROM activiti.ACT_RU_EXECUTION where proc_inst_id_=80011; +-------+---------------+------------+-------------------------+--------------------+---------+ | id_ | PROC_INST_ID_ | PARENT_ID_ | PROC_DEF_ID_ | ROOT_PROC_INST_ID_ | ACT_ID_ | +-------+---------------+------------+-------------------------+--------------------+---------+ | 80011 | 80011 | NULL | parallelProcess:1:80009 | 80011 | NULL | | 80018 | 80011 | 80011 | parallelProcess:1:80009 | 80011 | task4 | +-------+---------------+------------+-------------------------+--------------------+---------+ 2 rows in set (0.00 sec) mysql> select ID_,EXECUTION_ID_,PROC_INST_ID_,PROC_DEF_ID_,ASSIGNEE_,TASK_DEF_KEY_ from ACT_RU_TASK WHERE PROC_INST_ID_=80011; +-------+---------------+---------------+-------------------------+-----------+---------------+ | ID_ | EXECUTION_ID_ | PROC_INST_ID_ | PROC_DEF_ID_ | ASSIGNEE_ | TASK_DEF_KEY_ | +-------+---------------+---------------+-------------------------+-----------+---------------+ | 80028 | 80018 | 80011 | parallelProcess:1:80009 | 004 | task4 | +-------+---------------+---------------+-------------------------+-----------+---------------+ 1 row in set (0.00 sec)
复用了80018这个execution
004审批后流程结束。
经过以上例子能够看出
实际上不仅是分之,若是一个节点多我的审批,经过
multiInstanceLoopCharacteristics
指定,那么每次循环都会建立一个新的execution,这个就留给读者自行去验证。
这里说的task指的是usertask,usertask就是一我的的待办,能够经过activiti提供的api能够查询指定人当前待办信息,当activiti遇到usertask节点就会进入等待状态,等待用户审批完成后继续执行。用户的待办任务存储在ACT_RU_TASK
表上。