码迷,mamicode.com
首页 > 其他好文 > 详细

Other - 03 - Activiti学习笔记 - 概览

时间:2016-01-17 18:58:47      阅读:270      评论:0      收藏:0      [点我收藏+]

标签:

工作流开发核心流程分析

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!