Activit介绍

1、Activiti是什么?

Activiti 是一个新兴的基于 Apache 许可的支持 BPMN 2.0 标准的开源 BPM 产品。它是一个轻量级,可嵌入的 BPM 引擎,并且提供了功能丰富的开发和流程设计工具。

2、Activiti 基本架构和服务组件

Activiti 流程引擎重点关注在系统开发的易用性和轻量性上。每一项 BPM 业务功能 Activiti 流程引擎都以服务的形式提供给开发人员。通过使用这些服务,开发人员能够构建出功能丰富、轻便且高效的 BPM 应用程序。

image

上面是 Activiti 引擎的系统服务结构图,该图显示了引擎提供的所有功能组件,以下为七个服务的功能简介:

RepositoryService

Activiti 中每一个不同版本的业务流程的定义都需要使用一些定义文件,部署文件和支持数据 ( 例如 BPMN2.0 XML 文件,表单定义文件,流程定义图像文件等 ),这些文件都存储在 Activiti 内建的 Repository 中。Repository Service 提供了对 repository 的存取服务。

RuntimeService

在 Activiti 中,每当一个流程定义被启动一次之后,都会生成一个相应的流程对象实例。Runtime Service 提供了启动流程、查询流程实例、设置获取流程实例变量等功能。此外它还提供了对流程部署,流程定义和流程实例的存取服务。

TaskService

在 Activiti 中业务流程定义中的每一个执行节点被称为一个 Task,对流程中的数据存取,状态变更等操作均需要在 Task 中完成。Task Service 提供了对用户 Task 和 Form 相关的操作。它提供了运行时任务查询、领取、完成、删除以及变量设置等功能。

IdentityService

Activiti 中内置了用户以及组管理的功能,必须使用这些用户和组的信息才能获取到相应的 Task。Identity Service 提供了对 Activiti 系统中的用户和组的管理功能。

ManagementService

Management Service 提供了对 Activiti 流程引擎的管理和维护功能,这些功能不在工作流驱动的应用程序中使用,主要用于 Activiti 系统的日常维护。

HistoryService: History Service

用于获取正在运行或已经完成的流程实例的信息,与RuntimeService中获取的流程信息不同,历史信息包含已经持久化存储的永久信息,并已经被针对查询优化。

FormService

Activiti 中的流程和状态 Task 均可以关联业务相关的数据。通过使用FormService可以存取启动和完成任务所需的表单数据并且根据需要来渲染表单。

3、网关介绍

网关是用来控制流程执行的,在Activiti中,总共有四种网关:

3.1 排他网关(Exclusive Gateway)

排他网关用在流程中对决策进行建模。当流程执行到达此网关时,所有接下来的流程按照它们定义规则进行判断,当判断结果为真时,就继续执行该流程。

image

3.2 并行网关(Parallel Gateway)

网关也可以用来处理流程中的并发建模。在流程模型中引入并发的最直接方式是使用并行网关,它允许分支到多个执行路径或合并已经执行完成的路径。

并行网关的功能是基于进入和外出的顺序流的:

  • 分支(fork):并行后的所有外出顺序流,为每个顺序流都创建一个并发分支。
  • 汇聚(join):所有到达并行网关,在此等待的进入分支,直到所有进入顺序流的分支都到达以后,流程就会通过汇聚网关。
image

3.3 包容网关(Inclusive Gateway)

包含网关可以看做是排他网关和并行网关的结合体。和排他网关一样,你可以在外出顺序流上定义条件,包含网关会解析它们。但是主要的区别是包含网关可以选择多于一条顺序流,这和并行网关一样。

包含网关的功能是基于进入和外出顺序流的:

  • 分支:所有外出顺序流的条件都会被解析,结果为true的顺序流会以并行方式继续执行, 会为每个顺序流创建一个分支。
  • 汇聚:所有并行分支到达包含网关,会进入等待章台,直到每个包含流程token的进入顺序流的分支都到达。这是与并行网关的最大不同。换句话说,包含网关只会等待被选中执行了的进入顺序流。 在汇聚之后,流程会穿过包含网关继续执行。

注意:如果同一个包含节点拥有多个进入和外出顺序流, 它就会同时 含有分支和汇聚功能 。 这时,网关会先汇聚所有拥有流程token的进入顺序流, 再根据条件判断结果为true的外出顺序流,为它们生成多条并行分支。

image

3.4 基于事件网关(Event-based Gateway)

基于事件网关允许根据事件判断流向。网关的每个外出顺序流都要连接到一个中间捕获事件。当流程到达一个基于事件网关,网关会进入等待状态:会暂停执行。 与此同时,会为每个外出顺序流创建相对的事件订阅。

注意:基于事件网关的外出顺序流和普通顺序流不同。这些顺序流不会真的"执行"。相反,它们让流程引擎去决定执行到基于事件网关的流程需要订阅哪些事件。 要考虑以下条件:

  • 基于事件网关必须有两条或以上外出顺序流。
  • 基于事件网关后,只能使用 intermediateCatchEvent 类型。 (activiti不支持基于事件网关后连接ReceiveTask。)
  • 连接到基于事件网关的 intermediateCatchEvent 只能有一条进入顺序流。

4、表结构介绍

Activiti使用到的表都是ACT_开头的。

  • ACT_RE_*:‘RE’表示repository(存储),RepositoryService接口所操作的表。带此前缀的表包含的是静态信息,如,流程定义,流程的资源(图片,规则等)。

  • ACT_RU_*:‘RU’表示runtime,运行时表-RuntimeService。这是运行时的表存储着流程变量,用户任务,变量,职责(job)等运行时的数据。Activiti只存储实例执行期间的运行时数据,当流程实例结束时,将删除这些记录。这就保证了这些运行时的表小且快。

  • ACT_ID_*:‘ID’表示identity (组织机构),IdentityService接口所操作的表。用户记录,流程中使用到的用户和组。这些表包含标识的信息,如用户,用户组,等等。

  • ACT_HI_*:‘HI’表示history,历史数据表,HistoryService。就是这些表包含着流程执行的历史相关数据,如结束的流程实例,变量,任务,等等

  • ACT_GE_*:全局通用数据及设置(general),各种情况都使用的数据。

详细说明每张表:

ACT_EVT_LOG                 事件日志

ACT_GE_BYTEARRY             xml, png等二进制内容
ACT_GE_PROPERTY             引擎版本信息

ACT_HI_ACTINST              历史节点
ACT_HI_ATTACHMENT           历史附件
ACT_HI_COMMENT              历史意见表
ACT_HI_DETAIL               历史详情表,提供历史变量的查询
ACT_HI_IDENTITYLINK         历史参与者
ACT_HI_PROCINST             历史流程实例
ACT_HI_TASKINST             历史任务实例
ACT_HI_VARINST              历史变量实例

ACT_ID_GROUP                用户组信息表
ACT_ID_INFO                 用户的人员详细信息
ACT_ID_MEMBERSHIP           用户与群组关系
ACT_ID_USER                 用户的基本信息

ACT_PROCDEF_INFO            流程定义的动态变更信息

ACT_RE_DEPLOYMENT           部署信息表
ACT_RE_MODEL                模型(用于Web Designer)
ACT_RE_PROCDEF              流程定义数据
ACT_RE_EVENT_SUBSCR         事件监听

ACT_RU_EXECUTION            流程实例
ACT_RU_IDENTITYLINK         参与者
ACT_RU_JOB                  异步作业
ACT_RU_TASK                 任务节点
ACT_RU_VARIABLE             流程变量

5、事件监听机制

Activiti为我们提供了事件监听接口–ActivitiEventListener,ActivitiEventType则提供了各种可以监听到的事件类型,通过对应事件,获取有关联的用户,任务名称等。

public class OwnEventListener implements ActivitiEventListener {

    @Override
    public void onEvent(ActivitiEvent event) {
        
        if (event.getType() == ActivitiEventType.TASK_CREATED
                || event.getType() == ActivitiEventType.TASK_ASSIGNED
                || event.getType() == ActivitiEventType.TASK_COMPLETED) {
                
            ActivitiEntityEvent entityEvent = (ActivitiEntityEvent) event;
            
            //获取到Task对象
            TaskEntity taskEntity = (TaskEntity) entityEvent.getEntity();  
            
            //这里是发送邮件,也可以发送短信和微信等。
            MailWrapper.getInstance()
                .sendTaskMail(taskEntity.getOwner(), taskEntity.getAssignee(), taskEntity.getName(), event.getType());
        }
    }
}

当然,Activiti可以监听的事件远远不止任务类的,还包括如下:

public enum ActivitiEventType {

  // 实体相关的
  ENTITY_CREATED,
  ENTITY_INITIALIZED,
  ENTITY_UPDATED,
  ENTITY_DELETED,
  ENTITY_SUSPENDED,
  ENTITY_ACTIVATED,

  // 定时任务相关的
  TIMER_SCHEDULED,
  TIMER_FIRED,
  JOB_CANCELED,
  JOB_EXECUTION_SUCCESS,
  JOB_EXECUTION_FAILURE,
  JOB_RETRIES_DECREMENTED,

  // 引擎相关的
  ENGINE_CREATED,
  ENGINE_CLOSED,

  /**
   * 活动相关的
   */
  ACTIVITY_STARTED,
  ACTIVITY_COMPLETED,
  ACTIVITY_CANCELLED,
  ACTIVITY_SIGNALED,
  ACTIVITY_COMPENSATE,
  ACTIVITY_MESSAGE_WAITING,
  ACTIVITY_MESSAGE_RECEIVED,
  ACTIVITY_ERROR_RECEIVED,

  // 当BPMN抛出异常,但是流程中没有进行捕获时
  UNCAUGHT_BPMN_ERROR,

  // 变量相关的
  VARIABLE_CREATED,
  VARIABLE_UPDATED,
  VARIABLE_DELETED,

  // 任务相关的
  TASK_CREATED,
  TASK_ASSIGNED,
  TASK_COMPLETED,

  // 流程实例相关的
  PROCESS_STARTED,
  PROCESS_COMPLETED,
  PROCESS_COMPLETED_WITH_ERROR_END_EVENT,
  PROCESS_CANCELLED,
  
  // 历史流程相关的
  HISTORIC_PROCESS_INSTANCE_CREATED,
  HISTORIC_PROCESS_INSTANCE_ENDED,
  HISTORIC_ACTIVITY_INSTANCE_CREATED,
  HISTORIC_ACTIVITY_INSTANCE_ENDED,

  // 用户组相关的
  MEMBERSHIP_CREATED,
  MEMBERSHIP_DELETED,
  MEMBERSHIPS_DELETED;

  CUSTOM,
  SEQUENCEFLOW_TAKEN;
}

6、相关资源

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

推荐阅读更多精彩内容

  • 驰骋工作流引擎JFlow与activiti 对 比 分 析 报 告 目录 前言.. 3 工作流程引擎 - 对比.....
    开源驰骋工作流阅读 495评论 0 0
  • 一、了解工作流 工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是...
    Hiseico阅读 7,325评论 2 23
  • 最近做了一次对企业/云平台级工作流引擎Activiti的调查: TA,系出名门——由JBoss公司jBPM4引擎的...
    天空之诚阅读 25,387评论 7 93
  • 0209【静水流深】20171028学习力⑦期践行D18 上午去做手工玩习,主题为四季,用叶子来制作,果冻选择了冬...
    荔儿果果阅读 118评论 0 0
  • 丑丑妈妈第一次参加家长会,幼儿园的老师说:“你的儿子有多动症,在板凳上连三分钟都坐不了,你最好带他去医院看一看。”...
    大红小绿阅读 214评论 0 0