xiaobaoqiu Blog

Think More, Code Less

Activiti入门

最近在项目中涉及到工作流的知识,需要调研各个工作流引擎,顺道总结.

如何做流程服务,通常而言两种选择(在我的认知范围内的):

1.状态机
2.工作流

状态机通常意味着需要和业务状态绑定在一起,因此无法做到业务和流程分离,通常的后果就是业务和流程紧耦合.

因此,当我们的多个业务系统涉及到流程时候,可以考虑工作流.

1.工作流的基本知识

1.1 背景

先介绍几个术语:

1
2
3
4
5
6
7
8
9
10
11
12
1.BPM
业务流程管理(Business Process Management),基本内容是管理既定工作的流程,通过服务编排,统一调控各个业务流程,以确保工作在正确的时间被正确的人执行,达到优化整体业务过程的目的.
BPM概念的贯彻执行,需要有标准化的流程定义语言来支撑,使用统一的语言遵循一致的标准描述具体业务过程,这些流程定义描述由专有引擎去驱动执行,这个引擎就是工作流引擎.

2.Workflow
全部或者部分由计算机支持或自动处理的业务过程

3.WfMC
工作流管理联盟

4.BPMN
业务流程建模与标注(Business Process Modeling Notation),又叫业务流程建模符号.可以理解为工作流的建模语言.2004年5月发布了BPMN1.0规范.2011年BPMN2.0新规范的发布为各工作流产品互容互通提供了统一的标准,结束了各工作流厂商各自为政相互抵斥的局面.

参考: BPMN2新规范与Activiti5 BPMN2.0规范

1.2 工作流使用场景

具体什么场景下适合使用工作流,参考前任的总结:

when-to-use-windows-workflow-foundation

1
2
3
4
5
You may need WF only if any of the following are true:

1.You have a long-running process.
2.You have a process that changes frequently.
3.You want a visual model of the process

我理解,注意这里的第三点说的流程可视化的目的并不是为了展示,而是说工作流提供了一种给非开发人员(如运营人员)在线修改流程并且流程实时生效的途径(当然,需要业务支持).

when-to-use-workflow-engines

1
2
A workflow engine is useful when you need to go from a start to a finish but there are many different paths/logic/rules to get there.
if you have processes that are variable from start to end, use a workflow. If the same process can be used by everyone, then you don't need a workflow.

1.3 BPMN基本元素

简单介绍BPMN中的基本元素,详细内容可以在BPMN 2.0规范官网下载PDF版本(章节7.2).包含5个基本元素,每个基本元素下面又包含集中类型的元素,其中Flow Objects是最重要的:

1
2
3
4
5
1. Flow Objects 流对象
2. Data 数据
3. Connecting Objects 连接对象
4. Swimlanes 泳道
5. Artifacts 工件
(1).Flow Objects

Flow Objects包含了工作流的三个基本执行语义

1
2
3
4
5
6
7
8
(1).Events 事件
发生在流程执行过程中的事情.像流程的启动,结束,边界条件以及每个活动的创建,开始,流转等都是流程事件,利用事件机制,可以通过事件控制器为系统增加辅助功能.如其它业务系统集成及活动预警等

(2).Activities 活动
在工作流中所有具备生命周期状态的都可以称之为活动,如原子级的任务(Task)以及子流程(Sub-Process)等.任务是流程模型中最小工作单元,不能继续分解.

(3).Gateways 网关
Gateways用来决定流程流转指向的,简单理解就是判断条件.比如同意走一个流程,驳回走另外一个流程.

事件有三种类型:Start, Intermediate, End

(2).Data
1
2
3
4
Data Objects 数据对象
Data Inputs 数据输入
Data Outputs 数据输出
Data Stores 数据存储
(3).Connecting Objects

连接对象用来把各个流对象或流对象与其他信息连接起来

1
2
3
4
5
6
7
8
9
10
11
(1).Sequence Flows 序列流
表示流对象的前后执行顺序

(2).Message Flows 消息流
表示公开流程或协作模型里参与者之间的消息,交互

(3).Associations 结合关系
为流程中的元素关联信息或数据

(4).Data Associations 数据结合关系
表示数据在流程、活动和数据对象之间的传递
(4).Swimlanes

使用泳道来区分不同部门或者不同参与者的功能和职责。

1
2
Pools 池
Lanes 道
(5).Artifacts
1
2
Group 组
Text Annotation 文本注释

各种基本元素的示意图字节参考BPMN 2.0规范给出的图吧:

几个在线画图的应用如processon都支持BPMN图形.

参考: BPMN这点事-BPMN基本元素(上) BPMN这点事-BPMN基本元素(下)

2.常见的工作流引擎

2.1 jBPM

jBPM官网

2.2 Activiti

Activiti官网 Activiti用户手册 Activiti 5.16 用户手册中文版

2.3 FixFlow

FixFlow国人开发的工作流引擎 FixFlow github地址

2.4 如何选择

主要从易用性,维护成本等几个角度考虑:

1
2
3
4
1.流程设计器的支持;
2.嵌入到业务的成本,比如对Spring的支持等;
3.事务支持;
4.使用范围

目前来看,Activiti的使用是最简单方便的.

3.Activiti

支持最新BPMN2.0规范的开源工作流引擎Activit5,实现了对规范的绝大多数图元的定义(包括一些自己的扩展定义),能够满足企业工作流的各种复杂应用. 它是一个无侵入的,支持嵌入式和独立部署的开源工作流引擎,是Tom Bayen离开jBoss加入Alfresco公司后的另立山头之作.

关于Activiti的一些关键特性:

1
2
3
4
5
6
7
8
9
支持的流程格式: BPMN2、xPDL、jPDL等
引擎核心: PVM(流程虚拟机)
技术前身: jBPM3、jBPM4

数据库持久层: ORM MyBatis3
事务管理: MyBatis机制/Spring事务控制
数据库连接方式: Jdbc/DataSource
支持数据库: Oracle、SQL Server、MySQL等多数数据库
集成接口: SOAP、Mule、RESTful

几个关键的概念:

1
2
3
4
5
6
7
8
9
10
11
1.流程定义
BPMN语法定义的流程定义;比如请假流程定义:开始-->申请人发起-->直属leader审批-->部门leader审批-->人力审批-->结束;

2.流程实例
启动一个流程case,比如张三发起一个请假流程,这时候就会生成一个请假流程的实例;

3.历史流程实例
已经结束的流程,还是可以被查询到

4.任务
最常见的用户任务,即需要人参与的流程节点. 比如请假流程中的直属leader审批这个节点就会生成一个用户任务.

3.1 如何使用

这里主要大致说一下怎么结合Spring使用Activiti

Maven依赖

1
2
3
4
5
6
7
8
9
10
<dependency>
  <groupId>org.activiti</groupId>
  <artifactId>activiti-engine</artifactId>
  <version>5.14</version>
</dependency>
<dependency>
  <groupId>org.activiti</groupId>
  <artifactId>activiti-spring</artifactId>
  <version>5.14</version>
</dependency>

其中activiti-spring主要是提供了SpringProcessEngineConfiguration这个配置入口,并且提供ProcessEngineFactoryBean这个流程引擎的Bean,通过这个Bean,我们就可以获取Activiti内部的各种Service:

1
2
3
4
5
6
7
RepositoryService
RuntimeService
TaskService
HistoryService
ManagementService
IdentityService
FormService

activiti将其内部的表的建表语句和对应的Mybatis配置文件都打包在依赖jar包中,可以参考activiti-engine中的org.activiti.db这个包路径下的内容.

整合Acitiviti在线流程设计器 Activiti - 新一代的开源 BPM 引擎 http://www.infoq.com/cn/articles/bpmn2-activiti5

4.业务如何使用工作流

一般使用方式两种:

1
2
3
4
5
6
7
8
9
10
1.独立部署的工作流服务
对外服务方式: 接口
和业务交互方式: 接口或者MQ
优点: 彻底隔离工作流和业务;可以为多套业务提供服务;
缺点: 无法保证业务数据的强一致性

2.嵌入到业务系统
和业务交互方式: 直接调用
优点: 能保证业务数据的强一致性
缺点: 每套业务都需要自己单独使用工作流(存在重复工作)