最近在项目中涉及到工作流的知识,需要调研各个工作流引擎,顺道总结.
如何做流程服务,通常而言两种选择(在我的认知范围内的):
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
使用泳道来区分不同部门或者不同参与者的功能和职责。
(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.嵌入到业务系统
和业务交互方式: 直接调用
优点: 能保证业务数据的强一致性
缺点: 每套业务都需要自己单独使用工作流(存在重复工作)