在开始之前先看看下图,对整个对象结构有个了解,再结合下面的详细介绍理解。
1.ProcessInstance
员工开始申请请假流程,
通过runtimeService.startProcessInstance()方法启动,引擎会创建一个流程实例(ProcessInstance)。
简单来说流程实例就是根据一次(一条)业务数据用流程驱动的入口,两者之间是一对一的关系。
引擎会创建一条数据到ACT_RU_EXECUTION表,同时也会根据history的级别决定是否查询相同的历史数据到ACT_HI_PROCINST表。
启动完流程之后业务和流程已经建立了关联关系,第一步结束。
启动流程和业务关联区别:
a.对于自定义表单来说启动的时候会传入businessKey作为业务和流程的关联属性
b.对于动态表单来说不需要使用businessKey关联,因为所有的数据都保存在引擎的表中
c.对于外部表单来说businessKey是可选的,但是一般不会为空,和自定义表单类似
2.Execution
初学者最搞不懂的就是ProcessInstance与Execution之间的关系,要分两种情况说明。
Execution的含义就是一个流程实例(ProcessInstance)具体要执行的过程对象。
不过在说明之前先声明两者的对象映射关系:
ProcessInstance(1)--->Execution(N),其中N >= 1。
值相等的情况:
除了在流程中启动的子流程之外,流程启动之后在表ACT_RU_EXECUTION中的字段ID_和PROC_INST_ID_字段值是相同的。
3.Task
刚刚说了
ProcessInstance是和业务一对一关联的,和业务数据最亲密;Task是和用户最亲密的(UserTask),用户每天的待办事项就是一个个的Task对象。
从图1中看得出Execution和Task是一对一关系,Task可以是任何类型的Task实现,可以是用户任务(UserTask)、Java服务(ServiceTask)等,在实际流程运行中只不过面向对象不同,用户任务需要有人完成(complete),Java服务需要有系统自动执行(execution)。
Task是在流程定义中看到的最大单位,每当一个task完成的(complete)时候会引擎把当前的任务移动到历史中,然后插入下一个任务插入到ACT_RU_TASK中。
4.HistoryActivity
HistoryActivity——历史活动。
表ACT_HI_ACTINST
Activity包含了流程中所有的活动数据,例如开始事件(图中的第1条)、各种分支(排他、并行等,图中的第2条数据)、以及刚刚提到的Task执行记录(如图中的第3、4条数据)。
有些人认为Activity和Task是多对一关系,其实不是,从上图中可以看出来根本没有Task相关的字段。
结合请假流程来说如Task中提到的当完成流程的时候所有下一步要执行的任务(包括各种分支)都会创建一个Activity记录到数据库,例如领导审核节点点击“同意”按钮就会流转到人事审批节点,如果“驳回”那就流转到调整请假内容节点,每一次操作的task背后实际记录更详细的活动。
转自:http://www.kafeitu.me/activiti/2012/08/09/activiti-objects.html