Acitivi是比较早的工作流引擎,后来居上者如Flowable或者Camunda,功能以及一些特性做了一些增强,这两个都是从Activiti的某个版本分离出来,独自发展。Flowable是由Activiti的主要开发者在离开Alfresco公司后创建的。Flowable项目是在Activiti的基础上发展起来的,它继承了Activiti的许多核心特性,并引入了新的特性和改进。Camunda是从Activiti的一个分支发展而来的,它保留了Activiti的许多概念和模型,同时引入了自己的一套特性,例如对CMMN(Case Management Model and Notation)的支持。
不过提到Activiti,也避不开jBPM,jBPM是Activiti的前身之一,Activiti的一些核心理念和设计哲学受到了jBPM的影响。尽管jBPM和Activiti后来各自独立发展,但Activiti在某些方面仍然保留了jBPM的痕迹。
之前有两份工作中分别用到了Activiti和Flowable,Camunda还没在项目实战中用过,对Camunda的了解和学习主要来自于在广州图书馆无意中看到了一本关于Camunda的技术书籍,目前市面上也主要有Activiti和Camunda的技术书籍,Flowable相关的书籍,我在当当网和广州图书馆检索,都没有相关结果,我当时学习Activiti也是主要参考的国内的一本蓝皮的Activiti的书籍,并配有相关视频课程和源码,Flowable学习是因为有了Activiti的基础,因为Flowable和Activit有太多相同的地方了,学习起来其实很快,只需要重点看一些差异的部分就差不多了,而且国内有一个中文的翻译教程不错:Flowable BPMN用户手册
开始总结Activiti知识
目录
1. Activiti 架构
组件 | 描述 |
---|---|
Engine | 核心运行时环境,负责流程实例的创建、执行和管理。 |
Repository | 存储BPMN 2.0 XML流程定义的地方。 |
RuntimeService | 提供API来启动流程实例,查询流程实例和执行对象。 |
TaskService | 提供API来管理用户任务,如创建、查询、完成和删除。 |
IdentityService | 管理用户和组,以及它们之间的关系。 |
HistoryService | 提供API来查询历史数据,包括历史流程实例和变量。 |
ManagementService | 提供API来管理引擎的内部,如表和批次操作。 |
Form Engine | 表单渲染和管理。 |
Job Executor | 异步执行器,用于处理异步任务,如发送邮件或调用外部系统。 |
示例:附上mermaid(美人鱼)图及图代码,将mermaid图代码复制到draw.io工具中可以绘制出来
graph LR
A[Engine] --> B[Repository]
A --> C[RuntimeService]
A --> D[TaskService]
A --> E[IdentityService]
A --> F[HistoryService]
A --> G[ManagementService]
A --> H[Form Engine]
A --> I[Job Executor]
2.BPMN2.0支持
BPMN(Business Process Model and Notation)2.0是一种业务流程建模的标准,它提供了一个图形化的表示方法,用于描述业务流程。Activiti完全支持BPMN 2.0规范,以下是BPMN 2.0中一些关键元素的总结:
BPMN 2.0 元素 | 描述 |
---|---|
Start Event | 流程开始的事件。 |
End Event | 流程结束的事件。 |
Task | 需要执行的工作项。 |
Gateway | 用于控制流程分支和合并的逻辑结构。 |
Sequence Flow | 表示元素之间流转的箭头。 |
User Task | 需要人工参与的任务。 |
Service Task | 调用外部服务或业务逻辑的任务。 |
Script Task | 执行脚本代码的任务。 |
Exclusive Gateway | 排他网关,基于条件分流。 |
Parallel Gateway | 并行网关,用于创建并行路径。 |
Sub-Process | 一个可重用的子流程。 |
Call Activity | 调用另一个流程定义的活动。 |
Boundary Event | 附加在流程元素上的事件,用于中断或触发特定的行为。 |
Intermediate Catch Event | 中间捕获事件,用于捕获在流程执行中发生的事件。 |
Intermediate Throw Event | 中间抛出事件,用于在流程执行中抛出事件。 |
示例:
graph TD
A[Start Event] --> B[User Task]
B --> C[Exclusive Gateway]
C --> D[Task A]
C --> E[Task B]
D --> F[End Event]
E --> F
这是一个简单的流程,开始于一个开始事件,然后通过一个排他网关分流到两个任务中的一个,最后以结束事件结束。
3. 流程定义与部署
在Activiti中,流程定义是业务流程的模型,通常通过BPMN 2.0 XML文件来表示。部署是将流程定义添加到Activiti引擎中的过程,以下是流程定义与部署的关键概念:
概念 | 描述 |
---|---|
Process Model | BPMN 2.0 XML文件,定义了流程的结构和行为。 |
Deployment | 将Process Model添加到Activiti引擎的过程。 |
Process Definition | 部署后,流程模型在Activiti中的表示。 |
Process Instance | 流程定义的运行实例。 |
Diagram Generation | 从BPMN XML生成流程图。 |
Resource | 可以部署到Activiti的资源,如BPMN文件、表单文件等。 |
说明:首先创建了一个BPMN XML文件作为流程模型,然后通过部署将其添加到Activiti引擎中,从而创建了流程定义。流程定义可以用于启动流程实例。同时,BPMN XML文件也可以用于生成流程图,并且作为资源被部署。
4.执行流与任务管理
执行流是Activiti中流程实例的执行路径,而任务管理涉及到用户任务的创建、分配、执行和完成。以下是执行流与任务管理的关键概念:
概念 | 描述 |
---|---|
Execution Flow | 表示流程实例中的执行路径,包括顺序流和条件流。 |
Execution | 流程实例中的一个执行实体,可以是活动、网关或事件。 |
Task | 需要用户交互的活动,如审批、填写表单等。 |
Task Instance | 任务在流程实例中的一个实例。 |
Task Assignment | 将任务分配给特定的用户或组。 |
Task Completion | 用户完成任务,如审批通过或拒绝。 |
Task Form | 与任务关联的表单,用于收集用户输入。 |
Task Listener | 任务事件的监听器,可以在任务的特定事件时执行自定义逻辑。 |
示例:
graph LR
A[Process Instance] --> B[Execution Flow]
B --> C[Execution]
C --> D[Task]
D --> E[Task Instance]
E --> F[Task Assignment]
E --> G[Task Form]
E --> H[Task Listener]
F --> I[User/Group]
H --> J[Custom Logic]
这个示例中,流程实例产生了执行流,执行流由执行实体组成,这些实体可以是任务。任务在流程实例中创建了任务实例,任务实例可以被分配给用户或组,并且与任务表单和监听器相关联
5.表单集成
在Activiti中,表单集成是流程中收集用户输入的重要部分。表单可以是启动流程时填写的启动表单,也可以是流程中的任务表单。以下是表单集成的关键概念:
概念 | 描述 |
---|---|
Start Form | 启动流程实例时用户需要填写的表单。 |
Task Form | 与特定用户任务相关联的表单,用于在执行任务时收集数据。 |
Form Field | 表单中的输入字段,如文本框、下拉列表等。 |
Form Rendering | 表单的呈现方式,可以是HTML、PDF或其他格式。 |
Form Submission | 用户填写完表单后提交数据的动作。 |
Form Data Binding | 表单数据与流程变量的绑定。 |
External Form | 外部表单系统,如Web表单,与Activiti集成。 |
示例:
graph LR
A[Process Instance] --> B[Start Form]
A --> C[Task]
C --> D[Task Form]
B --> E[Form Field]
D --> E
E --> F[Form Data Binding]
B --> G[Form Submission]
D --> G
D --> H[Form Rendering]
H --> I[HTML/PDF]
J[External Form System] --> K[Integration]
K --> A
这个示例中,流程实例可能包括一个启动表单和一个或多个任务表单。表单字段用于收集用户输入,并通过数据绑定与流程变量关联。用户填写并提交表单后,表单数据被用于流程执行。此外,还可以将外部表单系统与Activiti集成。
6.事件与异常处理
在Activiti中,事件处理是流程设计中的一个重要组成部分,用于响应流程执行中的特定情况。以下是事件与异常处理的关键概念:
概念 | 描述 |
---|---|
Start Event | 定义流程开始的事件,可以是无事件、消息、定时器等。 |
End Event | 定义流程结束的事件,可以是无事件、消息、错误、信号等。 |
Intermediate Event | 中间事件,可以附加到活动上,用于中断或捕捉特定的事件。 |
Boundary Event | 附加在活动边界上的事件,用于中断活动或触发特定行为。 |
Signal | 在流程中发送和接收的信号,用于同步不同的流程实例。 |
Message | 用于在流程之间或外部系统集成时交换信息的消息。 |
Error Event | 用于处理错误情况的事件,可以是中间事件或边界事件。 |
Escalation | 异常情况下的升级处理,如任务升级给更高级别的用户。 |
Compensation | 对已经完成的活动进行补偿或撤销的操作。 |
示例:
graph LR
A[Process Instance] --> B[Start Event]
A --> C[User Task]
C --> D[End Event]
C --> E[Boundary Event]
C --> F[Intermediate Event]
E --> G[Compensation]
F --> H[Signal]
H --> I[Signal Catch]
B -.-> J[Message Start]
D -.-> K[Message End]
E -.-> L[Error End]
C -.-> M[Escalation]
这个示例中,流程实例从开始事件启动,可能包括消息开始事件或定时器开始事件。用户任务可以有边界事件附加,用于处理异常情况,如错误或信号中断。中间事件可以用于捕捉信号或抛出消息。结束事件可以是消息结束事件或错误结束事件。此外,还有补偿和升级机制来处理异常。
7.业务规则引擎
业务规则引擎(Business Rule Engine, BRE)是Activiti中的一个组件,用于将业务逻辑从流程逻辑中分离出来,使业务规则可以独立于流程模型进行管理和维护。以下是业务规则引擎的关键概念:
概念 | 描述 |
---|---|
Business Rules | 定义业务决策的逻辑,可以是简单的或复杂的。 |
Rule Engine | 用于执行业务规则的引擎。 |
Drools | Activiti支持的业务规则引擎之一,用于编写和执行Drools规则。 |
Rule Task | BPMN中的一个任务类型,用于执行业务规则。 |
Decision Table | 用于以表格形式定义业务规则的工具。 |
Rule Dependency | 业务规则之间的依赖关系。 |
Rule Versioning | 业务规则的版本管理,用于跟踪和维护不同版本的规则。 |
示例:
graph LR
A[Business Process] --> B[Rule Engine]
B --> C[Business Rules]
B -.-> D[Drools]
C --> E[Rule Task]
E --> F[Decision Table]
C --> G[Rule Dependency]
G --> H[Rule Versioning]
这个示例中,业务流程调用业务规则引擎来执行业务规则。Drools是Activiti支持的一个业务规则引擎,可以用于编写和执行规则。业务规则通过Rule Task在BPMN模型中实现,决策表(Decision Table)是定义业务规则的一种方式。业务规则的依赖关系和版本管理对于维护和更新规则非常重要。
如果想要了解Drools在项目中的使用,可以参考我2021年写的一篇博客:SpringBoot整合Drools规则引擎动态生成业务规则_kmodulebeanfactorypostprocessor-CSDN博客
8. 数据关联
在Activiti中,数据关联是流程模型中不同元素之间交换数据的方式。以下是数据关联的关键概念:
概念 | 描述 |
---|---|
Process Variables | 流程级别的变量,用于在流程的不同部分之间传递数据。 |
Local Variables | 局部变量,用于在单个活动中存储临时数据。 |
Data Objects | 用于在子流程中存储和传递数据的对象。 |
Input Parameters | 活动或子流程的输入参数,用于接收传递进来的数据。 |
Output Parameters | 活动或子流程的输出参数,用于将数据传递给调用者。 |
Data Associations | 定义变量、数据对象和流程元素之间的数据流。 |
Form Data | 表单提交的数据,通常与流程变量进行绑定。 |
Script Task | 使用脚本语言处理数据的特定任务类型。 |
9. 服务任务与脚本任务
服务任务(Service Task)和脚本任务(Script Task)是BPMN中用于执行业务逻辑的两种任务类型。以下是服务任务与脚本任务的关键概念:
概念 | 描述 |
---|---|
Service Task | 用于执行特定的业务逻辑或服务调用的任务。 |
Script Task | 允许使用脚本语言(如JavaScript)编写和执行业务逻辑的任务。 |
Business Logic | 业务流程中的逻辑,可以是计算、数据处理或外部系统调用。 |
External System | 服务任务可能调用的外部系统或服务。 |
Script Language | 用于编写脚本任务的编程语言,如JavaScript或Python。 |
Task Configuration | 服务任务和脚本任务的配置,如调用的类或方法。 |
示例:
graph LR
A[BPMN Process] --> B[Service Task]
B --> C[Business Logic]
C --> D[External System]
A --> E[Script Task]
E --> F[Script Language]
F --> G[JavaScript/Python]
B --> H[Task Configuration]
H --> I[Class/Method]
E --> J[Task Configuration]
J --> I
这个示例中,BPMN流程中可以包含服务任务和服务调用的业务逻辑,服务任务可能与外部系统集成。脚本任务允许使用指定的脚本语言来实现业务逻辑,通常涉及编写和执行脚本代码。任务配置是服务任务和脚本任务执行所必需的,它定义了执行的类或方法。
10. 排他网关与并行网关
在BPMN中,网关用于控制流程的分支和合并。排他网关(Exclusive Gateway)和并行网关(Parallel Gateway)是两种常见的网关类型。以下是排他网关与并行网关的关键概念:
概念 | 描述 |
---|---|
Exclusive Gateway | 排他网关,用于在多个分支中选择一个路径继续执行。 |
Parallel Gateway | 并行网关,用于创建并行路径,所有分支同时执行。 |
Fork | 流程分支的起点,由并行网关创建。 |
Join | 流程分支的终点,由并行网关创建,合并所有并行路径。 |
Default Sequence Flow | 默认的流程流转路径,当条件不满足时所采取的路径。 |
Conditions | 用于排他网关的分支选择的条件表达式。 |
示例:
排他网关根据条件选择执行路径A或B,而并行网关则创建了两个并行路径C和D,它们同时执行并在另一个并行网关处合并
11. 用户与组管理
用户与组管理是Activiti中用于定义和管理用户和组的机制,它允许对用户和组进行授权和认证。以下是用户与组管理的关键概念:
概念 | 描述 |
---|---|
Users | 系统中的个人账户,用于代表个体用户。 |
Groups | 用户的集合,通常用于角色或权限的分配。 |
Identity Management | 用户和组的管理,包括创建、更新、删除用户和组。 |
Membership | 用户与组之间的关系,一个用户可以是多个组的成员。 |
Permissions | 定义用户或组可以执行的操作,如读取、写入、启动流程等。 |
示例:
graph TD
A[Identity Management] --> B[Users]
A --> C[Groups]
B --> D[Permissions]
C --> D
E[Membership] --> B
E --> C
F[Process Instance] --> G[Task Assignment]
G --> B
G --> C
这个示例中,身份管理负责管理用户和组。用户和组都有与之关联的权限,这些权限决定了它们在系统中可以执行的操作。成员关系定义了用户和组之间的关系,用户可以是多个组的成员。流程实例中的任务分配可以指定特定的用户或组来执行。
12.权限与安全
在Activiti中,权限与安全是确保流程和数据安全的重要机制。以下是权限与安全的关键概念:
概念 | 描述 |
---|---|
Authentication | 确认用户身份的过程,确保只有授权用户才能访问系统。 |
Authorization | 确定已认证用户可以执行的操作或访问的资源的过程。 |
Permissions | 用户或组可以拥有的权限级别,如读取、写入、删除等。 |
Resource | 系统中的一个实体,如流程定义、流程实例、任务等。 |
Role-Based Access Control (RBAC) | 基于角色的访问控制,通过角色分配权限。 |
Attribute-Based Access Control (ABAC) | 基于属性的访问控制,根据用户属性授予权限。 |
示例:
graph TD
A[Security] --> B[Authentication]
A --> C[Authorization]
B --> D[Users]
C --> E[Permissions]
E --> F[Resource]
G[Groups] --> H[RBAC]
I[Attributes] --> J[ABAC]
H --> E
J --> E
这个示例中,安全由认证和授权组成。用户通过认证过程确认身份,然后根据授权获得相应的权限。资源是系统中的实体,如流程实例或任务。基于角色的访问控制(RBAC)和基于属性的访问控制(ABAC)是两种常见的权限管理方式。
13. 历史数据管理
历史数据管理在Activiti中用于追踪和记录流程执行的历史信息,这对于审计和监控流程非常重要。以下是历史数据管理的关键概念:
概念 | 描述 |
---|---|
Historical Data | 流程实例、活动、任务、变量等的执行历史记录。 |
Process Instance History | 记录流程实例的创建、结束等历史信息。 |
Activity Instance History | 记录活动实例的执行历史,包括开始和结束时间。 |
Task Instance History | 记录任务实例的创建、完成、分配给用户等信息。 |
Variable Instance History | 记录变量值的变化历史。 |
History Level | 定义历史数据记录的详细程度,如不记录、记录流程实例、记录所有实例等。 |
History Service | 提供API来查询历史数据。 |
Audit Trail | 用于审计的详细历史记录,包括谁、何时、做了什么。 |
示例:
graph TD
A[History Data Management] --> B[Historical Data]
B --> C[Process Instance History]
B --> D[Activity Instance History]
B --> E[Task Instance History]
B --> F[Variable Instance History]
A --> G[History Level]
G --> H[History Configuration]
A --> I[History Service]
I --> J[Audit Trail]
这个示例中,历史数据管理涵盖了流程实例、活动实例、任务实例和变量实例的历史记录。历史级别定义了记录的详细程度,而历史服务提供了查询这些历史数据的API。审计追踪是历史数据的一部分,用于记录详细的操作日志。
14.外部系统集成
Activiti可以与外部系统集成,以便在业务流程中利用外部资源和服务。以下是外部系统集成的关键概念:
概念 | 描述 |
---|---|
Service Task | 在BPMN中用于集成外部系统的服务调用。 |
Message Queue | 用于异步通信的队列,如RabbitMQ或Kafka。 |
Web Service | 通过网络提供的服务,Activiti可以通过HTTP请求与之交互。 |
Database | 持久化存储流程数据,Activiti支持多种关系型数据库。 |
REST API | 通过RESTful服务进行集成,Activiti可以作为客户端或服务端。 |
Event Listener | 监听外部事件并触发流程中的相应动作。 |
Plugin | 扩展Activiti功能的自定义组件,可以用于特殊集成需求。 |
示例:
graph LR
A[Activiti Engine] --> B[Service Task]
A --> C[Message Queue]
A --> D[Web Service]
A --> E[Database]
A --> F[REST API]
A --> G[Event Listener]
A --> H[Plugin]
这个示例中,Activiti通过服务任务与外部系统集成,可以与消息队列、Web服务、数据库、REST API以及事件监听器进行交互。此外,还可以使用插件来实现特定的集成需求。
15.API 接口
Activiti提供了丰富的API接口,允许开发者以编程方式与Activiti引擎交互。以下是API接口的关键概念:
概念 | 描述 |
---|---|
Repository API | 用于管理流程定义和部署的API。 |
Runtime API | 用于管理流程实例和执行对象的API。 |
Task API | 用于管理用户任务和任务实例的API。 |
Identity API | 用于管理用户、组和权限的API。 |
History API | 用于查询历史数据的API。 |
Management API | 用于管理Activiti引擎的内部,如表和批次操作的API。 |
Query API | 提供复杂查询功能的API。 |
Form API | 用于管理表单和表单提交数据的API。 |
示例:
graph TD
A[Activiti API] --> B[Repository API]
A --> C[Runtime API]
A --> D[Task API]
A --> E[Identity API]
A --> F[History API]
A --> G[Management API]
A --> H[Query API]
A --> I[Form API]
Activiti API分为不同的模块,每个模块负责不同的功能。开发者可以根据自己的需求选择相应的API进行流程管理、任务管理、用户管理等操作。
16.数据库与持久化
Activiti使用数据库来持久化流程实例、任务、变量、历史数据等信息。Activiti集成到项目中的时候,比如集成到SpringBoot项目,在部署工作流之后,启动项目,工作流引擎会自动创建必须的核心自带的工作流相关数据库表。
表名 | 描述 |
---|---|
ACT_RE_DEPLOYMENT |
存储部署的流程定义文件,每个部署单元在该表中有一条记录。 |
ACT_RE_MODEL |
存储模型编辑器的模型。 |
ACT_RE_PROCDEF |
存储流程定义信息。 |
ACT_RU_EXECUTION |
存储运行中的流程实例的执行流。 |
ACT_RU_JOB |
存储异步任务(如定时器、异步服务任务)。 |
ACT_RU_TASK |
存储用户任务的信息。 |
ACT_RU_IDENTITYLINK |
存储与流程元素(如任务)相关联的用户和组。 |
ACT_RU_VARIABLE |
存储运行中的流程实例的变量。 |
ACT_HI_PROCINST |
存储已结束的流程实例的历史信息。 |
ACT_HI_ACTINST |
存储活动实例的历史信息。 |
ACT_HI_TASK |
存储任务实例的历史信息。 |
ACT_HI_VARINST |
存储变量实例的历史信息。 |
ACT_HI_DETAIL |
存储历史细节信息,如流程变量的更改历史。 |
ACT_HI_COMMENT |
存储历史备注,如用户评论。 |
ACT_HI_ATTACHMENT |
存储流程中的附件信息,如用户上传的文件。 |
ACT_ID_GROUP |
存储组信息。 |
ACT_ID_MEMBERSHIP |
存储用户和组之间的关联关系。 |
ACT_ID_USER |
存储用户信息。 |
ACT_ID_INFO |
存储有关Activiti引擎的元数据信息。 |
最后说明:一般在项目中使用Activiti,最主要的工作是绘制工作流程BPMN图,首选是Activiti的官方explorer,集成的教程,贴上我之前写的集成安装过程:SpringBoot集成Activiti Explorer_activiti7集成 explorer2-CSDN博客
最近几天把之前用到的一些技术及中间件知识总结一下,然后准备开始花多一些时间来学习英语口语以及总结英语单词,去年和今年感受到了行业的寒冬,找工作是真的难,希望可以好好学习英语,以后能多一点选择和机会!哎,真难!