标签:
工作流开发核心流程分析
1.绘制流程图
Activiti开发的第一步就是根据需求绘制流程图,流程图定义了流程是如何进行的,流程跳转的条件等等。流程图的定义也不是随意定义的,而是根据业务需求进行定义。
在Eclipse下绘制流程图,首先要装上Activiti的插件,之后就可以新建一个Activiti Diagram了。
绘制Activiti图比较简单,只说几点重要的:
1)一个流程必须有一个开始节点和一个结束节点,开始节点只能有outcomeline,结束节点只能由incomeline。
2)一个连线可以有名字也可以没有,但建议有,而且写成同意/拒绝形式,最后可以在程序内拿到这个名字,直接拼接在页面上。
3)一个任务节点必须有一个办理人(个人任务)或者办理人组(组任务)之一, 这个办理人(组)可以写死,也可以写成占位符形式(#{assignee})。
4)一个任务节点如果只有一个outcomeline,则这个outcomeline可以不设置条件,如果一个任务节点有多个outcomeline,则每一个outcomeline都必须指明条件,如果运行时不满足任一条件则会报错,条件指明用一个布尔占位符(#{condition == true})。
2.部署流程
Activiti流程图画完之后,就需要部署它,通过repositoryService部署完之后就会得到一个Deployment部署对象,一个部署对象下面挂着一个或多个ProcessDefinition流程定义对象(取决于这一次部署加载了几个bpmn流程图文件)。repositoryService还负责管理所有和部署/流程定义相关的CRUD。
如果多次加载一个具有相同的processId的bpmn文件,则这个文件会被解析为一个流程定义,而且processId相同,则会引发版本升级。
3.开始任务
部署完毕任务之后,整个工作流就进入了就绪状态,可以通过runtimeService开始一个流程了,流程开始之后会得到ProcessInstance流程实例和一个task任务实例,此后只需要推进这个task就可以完成流程了。
开始流程的时候可以选择性的添加流程变量,来帮助工作流引擎完成分支的挑选。
使用...ByKey()系列开始的任务,其总会选择流程定义的最新版本。
开始任务时,可以选择性的添加一个BusinessKey字段,此字段代表着业务的键,可以通过这个BusinessKey找到此流程实例对应的业务实例。
4.完成任务
1)个人任务
个人任务的完成只需要预置流程变量即可,需要预置两类流程变量,一类是关于选择连线相关的流程变量,一类是关于下一个待办者相关的流程变量。之后就调用 taskService.completeTask(...) 完成任务即可。
2)组任务
组任务的完成需要先进行任务的拾取,使用当前用户来拾取这个组任务,taskService.cliam() 函数用来拾取任务,之后组任务就变成了个人任务,就遵循个人任务的规则进行即可。
一个原来是组任务的任务,进行拾取之后就会变成个人任务,那么这个任务也可以通过 taskService.setAssignee(,null) 来回退到组任务。
3)任务批注
对于一个任务,每一个执行者都可以选择添加批注(而且可以多次添加),在完成任务之前,调用 Authentication.setAuthenticatedUserId() 来设置当前批注的用户id(一般设置的是写批注的人的名字,这个名字会在最后取出来展示),之后调用 taskService.addComment(...) 对此任务添加批注。
5.查询待办任务/查询历史任务
1)查询待办任务
查询的规则为首先根据办理者查询taskInstance待办任务,然后从待办任务中连出外键找到processInstance流程实例,然后通过流程实例拿到BusinessKey,可以拿到业务数据,在然后可以通过processInstance拿到批注信息(taskService.getProcessInstanceComments(...))。
2)查询历史任务
规则同查询待办任务,不过调用的是historicService。
工作流开发扩展流程分析
1.排他网关
排他网关是一个菱形,中间一个叉的图形。排他网关大体上等价于一个有多个outcomeline的任务,但是多个outcomeline的任务必须严格的给每一个oucomeline连线指定其condition,而排他网关可以给其 N - 1 个outcomeline指定连线,剩下的一根连线作为默认值。
绘制时,点击排他网关,选择default flow。
2.并行网关
并行网关是一个菱形,中间一个十字的图形。并行网关代表一组并行发生的任务,并行网关必须是成对出现的,一个并行分散,一个并行收束,在分开和收束之间的每一个流程,都组成一个执行对象(执行对象分析参考表分析),而且这些流程都是并行执行的,如果其中一条流程已经到达收束节点,那么它将会等待其他流程到达收束节点。
3.获取连线
通过把 ProcessInstance 转型为 ProcessInstanceEntity 可以获取一些额外的流程信息(部署的bpmn文件中的值)。
工作流表分析
工作流引擎会自动创建25张表,主要分为5个大组
1)act_ge_... 全局属性组
2)act_hi_... 历史信息组
3)act_id_... 认证信息组(不使用)
4)act_re_... 仓库信息组
5)act_ru_... 运行时信息组
下面只分析重要的而且用到的表
1)部署
1. 当刚进行部署的时候会从 ACT_GE_PROPERTY 表中查询出下一个数据库键的ID,此表中还存着当前工作流引擎的一些元信息,用来检测当前工作流引擎是否和数据库版本匹配,所以 ACT_GE_PROPERTY 表是数据库元信息表。
2. 之后会向 ACT_RE_DEPLOYMENT 表中插入部署的信息,包括部署的ID,部署的NAME,部署时间等信息,所以 ACT_GE_DEPLOYMENT 表中的记录就是记录部署信息的,所以ACT_GE_DEPLOYMENT 表是部署信息表。
3. 在往后就要向 ACT_GE_BYTEARRAY 表中插入部署的BPMN文件和资源文件,所以此表中 DEPLOYMENT_ID_ 是部署信息表ID_的外键。所以 ACT_GE_BYTEARRAY 就是序列化资源表。
4. 之后就会解析所有的BPMN文件,生成流程定义信息,这个信息会插入到 ACT_PROCDEF_INFO 表中,而此表的信息是通过 ACT_GE_BYTEARRAY 表中存着的BPMN序列化文件解析得到的,所以 ACT_PROCDEF_INFO 表中的 INFO_JSON_ID 是 ACT_GE_BYTEARRAY 表中的 ID_。所以ACT_PROCDEF_INFO 表示流程定义解析结果信息表。
5. 然后工作流引擎就会加载一个流程定义,存到 ACT_RE_PROCDEF 表中,此表即为真正的流程定义对象表。
结论:一个部署对应多个资源,资源中的一部分是BPMN序列化对象,一个BPMN序列化对象对应一个流程定义解析结果,所以一个部署对应多个资源,资源中的BPMN文件与流程定义对象一一对应,所以一个部署也可以对应多个流程定义对象。所有 ACT_RE_... 系列的表为持久化对象表。
2)进行流程
1. 当调用 runtimeService.startProcessBy...(...) 时,会从流程定义对象表 ACT_RE_PROCDEF 中提取流程信息,并且创建一个流程实例(流程定义是类,流程实例是对象的感觉),插入 ACT_RU_EXECUTION 表中。流程实例即代表着整个流程从开始到结束,不论是哪条路径,另外还有一个对象,叫执行对象,在 ACT_RU_EXECUTION 表中,ID_ 代表的是执行对象ID,PROC_INST_ID_ 代表的是流程实例ID,如果是单线流程,那么执行对象ID和流程实例ID是相同的,而且表中只有一条数据,此数据既代表执行对象又代表流程实例;如果是多线流程(并行网关),那么会有两组数据,第一组是流程实例对象,此对象 ID_ 和 PROC_INST_ID_ 相等,而且此对象只对应一条数据,第二组是执行对象,有几条并行线就有几个执行对象,此组记录 ID_ 代表执行对象ID,PROC_INST_ID_ 代表流程实例ID,他们不相等。所以 ACT_RU_EXECUTION 是执行对象表。
2. 当 ACT_RU_EXECUTION 表中有执行对象时,那么这个执行对象一定会外键出一个任务,任务即流程中的每一个节点,任务会插入在 ACT_RU_TASK 表中,所以 ACT_RU_TASK 表示任务记录表。
3. 每一个任务必须有一个办理人,对于个人任务办理人即是 ACT_RU_TASK 表中的 ASSIGNEE_ 字段,对于组任务,办理人组在 ACT_RU_IDENTITYLINK 表中,一对多关系。所以 ACT_RU_IDENTITYLINK 表示组任务办理人表。
4. 每一个流程实例都有其对应的流程变量,流程变量可以在开始任务时设置,也可以在完成任务时设置,也可以直接设置,流程变量会存在 ACT_RU_VARIABLES 表中,一般设置的流程变量的所属者是流程实例,但是如果设置的是 Local 的流程变量,那么 ACT_RU_VARIABLES 表中的 TASK_ID_ 字段也有值,代表此流程变量是和任务相绑定的。所以 ACT_RU_VARIABLES 表示流程变量表。
结论:ACT_RU_... 系列的表为运行时的记录表,所有运行时的状态流转都在这些表中记录。
3)完成/结束任务/批注
1. 当完成一个任务的时候,任务记录就会从 ACT_RU_TASK 表中删除,然后流转到下一个任务,插入下一个任务的记录,如果没有下一个任务,那么整个流程执行完毕,则没有新的任务记录,而且执行对象/流程实例的生命周期也随之结束,记录被移除。任务/流程实例被移除的时候,其外键的流程变量/批注也会被移除。
2. 当所有的流程实例/任务/流程变量/批注/组任务办理者被创建的时候,都会往其对应的历史表中插入记录,分别对应 ACT_HI_PROC_INST / ACT_HI_TASKINST / ACT_HI_VARINST / ACT_HI_COMMENT / ACT_HI_IDENTITYLINK,批注没有运行时表,创建时直接插入历史表。而且每一个活动被执行的时候(包括开始任务/结束任务/等),都会往 ACT_HI_ACTINST 表中插入记录。
结论:ACT_HI_... 系列表为历史纪录表,所有历史数据都在这些表中记录。
Other - 03 - Activiti学习笔记 - 概览
标签:
原文地址:http://www.cnblogs.com/yaowu/p/19a39798edec2d778c06f96c4b7a2606.html