工作流引擎Activiti经过多年的发展,已经变成一个成熟的工作流框架,在2017年,Activiti推出了全新的6.0版本,除了完善对BPMN规范的支持外,还加入了对DMN规范的支持。为了能让广大的程序开发者一探新版本Activiti的功能,笔者在di yi版的基础上,编写了本书的第二版。书中会对Activiti的知识进行全面讲解,并从源码角度对Activiti进行深度剖析。本书会以Activiti为基础,讲述该框架的API使用、BPMN规范,除了这些工作流的基本知识外,还讲解了zui新的DMN规范引擎、Activiti整合Spring Boot等内容。在本书的第18章,深入Activiti的源代码,展示舍弃流程虚拟机(PVM)之后的Activiti,如何对流程进行控制,让读者能一窥Activiti的庐山真面目。zui后一章,以一个案例结束本书的内容,案例中整合Spring、Struts2等主流框架,目的是让读者在学习的过程中更贴近实际案例。
1. 内容深入。书中的案例不仅仅讲解Activiti的功能,更模仿Activiti的思路去模拟功能的实现,读者可以深入了解其中的原理。
2. 开发环境与案例更贴近实际。书中案例的开发环境、使用的框架以及工具均是来自企业的实际应用,案例的选取与研发过程更贴近实际。
3. 注释详细本书的代码,几乎每行Java代码均有注释,读者可以很容易的了解代码的意思,轻松的掌握相应的知识。
前 言
当今技术发展一日千里,各种技术框架如雨后春笋般涌现,技术正在改变世界、改变生活。作者从业十余年,面对如此变幻莫测的世界,亦难岿然不动,面对日新月异的知识,时常怀着一颗谦卑的心。只有学习,才能带来快乐,才不会被淘汰。程序是枯燥的,但程序又是美丽的,看似冷冰冰的代码,实则丰富多彩。
Java是目前世界上应用最广泛的语言,在Java领域出现了众多优秀的框架和组件,这些组件正在慢慢提高编程的效率,使得编程这项原本枯燥的工作变得更为优雅与简单。在工作流领域,涌现出多个使用Java语言编写的框架,如OpenWFE、jBPM、Shark,甚至在国内市面上出现了不少国产的工作流引擎。近年来,出现了一款全新的工作流框架Activiti,经过几年的发展,Activiti已经成为一款成熟的工作流产品。笔者在2014年,基于Activiti 5.0版本,编写了《疯狂Workflow讲义》第一版,Activiti 6.0在2017年发布,为了帮助广大的Java研发者学习新框架,笔者对《疯狂Workflow讲义》进行升级,并将多年的实践经验融入本书中。
本书经过约半年的编写,至今能得以付梓,得益于多方襄助,对他们的感激之情,难以言表。感谢传道并解惑的恩师,感谢聪颖而好学的读者,感谢善良和亲爱的家人,笔者会谢意永存、铭感不忘。
本书内容概括
本书是一本介绍Java工作流领域的书,以Activiti为核心,内容囊括了多个流行的企业级Java EE框架,全书主要可分为以下几个部分。
第一部分:对Activiti的基础知识进行讲解,包括框架起源、基本的设计模式、数据库设置以及框架配置等,该部分知识可以帮助读者对Activiti有一个较为深入的认识,对Activiti的设计有一个初步的印象,该部分内容也可以作为整合Activiti到项目中的参考。
第二部分:从源代码的实现上讲解Activiti各个模块的API,除了讲述这些API的作用外,还会引领读者深入到这些API的内部,此部分内容可以作为一个详细的Activiti API的帮助文档。
第三部分:详细讲述了BPMN 2.0规范的内容,包括目前Activiti对该规范的实现情况。在讲解BPMN 2.0规范时,将规范与Activiti的实现进行结合,让读者在通俗易懂的例子示范下,对Activiti的实现及BPMN 2.0规范有较为深入的了解。
第四部分:Activiti 6支持的DMN规范,本书将在第15章中讲述Activiti基于DMN规范的规则引擎。Activiti的规则引擎目前尚未正式面世,笔者研读了当前版本的源代码,并带领读者优先体会了Activiti的规则引擎。
第五部分:讲述如何在实际企业应用中使用Activiti,并与其他流行的开源框架进行整合,包括企业应用开发所必须使用的Web Service、企业服务总线、规则引擎、IoC框架和ORM框架等。除了主要的Activiti知识外,企业中常用框架的知识,也在该部分内容中得到了体现。通过学习这部分内容,可以极大丰富你的实战知识,让你成为一个更全面的技术人员。
第六部分:在第18章中讲述了Activiti的核心架构及Activiti的表单知识,本书最后一章,通过讲解一个办公系统的开发过程,让读者更了解Activiti在实际生产中的应用,从而理论层面,走上实践的道路。
本书特点
笔者长期工作于企业的IT部门,有着丰富的企业应用开发经验,因此本书具有以下特点。
1. 内容深入
从笔者接触编程开始,就养成了查看源代码的习惯,书中的示例不仅仅能帮助理解Activiti的功能,更借鉴了Activiti的思路去模拟功能的实现,所以读者能够深入了解其中的原理。
2. 开发环境与示例更贴近实际
本书中示例的开发环境、使用的框架及工具均来自企业的实际应用,示例的选取与研发过程更贴近实际。
3. 注释详细
本书的代码几乎每行都有注释,读者可以很容易地了解代码的意思,轻松掌握相应的知识。
本书写给谁看
如果你有一定的Java语言基础,进行过Web项目的开发,对工作流有一定的认识,那么本书可以帮助你提升关于工作流的知识水平。如果你是一个从事过企业应用开发的程序员,本书同样适合你,本书的知识可以帮助你深入理解工作流引擎,使你可以将这些工作流框架应用到实际的企业生产中。
衷心感谢
首先非常感谢李刚老师,一直以来,他既是我的老师,也是我的技术后盾,非常幸运人生能有这样一位良师益友。
其次感谢出版社的编辑,为本书的出版做了很多细致的工作,并为本书提出了许多宝贵的意见。
最后感谢我的家人,你们是我前进的动力。
杨恩雄,从事十多年Java EE企业应用开发,曾任中企动力系统设计师、中企开源项目经理、数码辰星科技公司项目经理,参与过多个企业级项目的设计与架构工作,曾负责辰星电影票网络销售系统的整体架构。精通Activiti、Drools、ESB等开源技术,在SOA、SaaS、大数据应用、互联网系统架构方面有着丰富的经验,曾出版《疯狂Java实战演习》《疯狂Workflow讲义》《疯狂Spring Cloud微服务架构实战》等书籍。
第1章 Activiti介绍1
1.1 工作流介绍2
1.2 BPMN 2.0规范简述2
1.2.1 BPMN 2.0概述3
1.2.2 BPMN 2.0元素3
1.2.3 BPMN 2.0的XML结构5
1.3 Activiti介绍5
1.3.1 Activiti的出现5
1.3.2 Activiti的发展5
1.3.3 选择Activiti还是jBPM5
1.4 本章小结6
第2章 安装与运行Activiti7
2.1 下载与运行Activiti8
2.1.1 下载和安装JDK8
2.1.2 下载和安装MySQL9
2.1.3 下载和安装Activiti10
2.2 运行官方的Activiti示例11
2.2.1 请假流程概述11
2.2.2 新建用户11
2.2.3 定义流程12
2.2.4 发布流程14
2.2.5 启动与完成流程15
2.2.6 流程引擎管理16
2.3 安装开发环境17
2.3.1 下载Eclipse17
2.3.2 安装Activiti插件18
2.4 编写第一个Activiti程序19
2.4.1 如何运行本书示例19
2.4.2 建立工程环境19
2.4.3 创建配置文件20
2.4.4 创建流程文件20
2.4.5 加载流程文件与启动流程21
2.5 本章小结22
第3章 Activiti数据库设计23
3.1 通用数据表24
3.1.1 资源表24
3.1.2 属性表24
3.2 流程存储表25
3.2.1 部署数据表25
3.2.2 流程定义表25
3.3 身份数据表25
3.3.1 用户表25
3.3.2 用户账号(信息)表26
3.3.3 用户组表26
3.3.4 关系表26
3.4 运行时数据表26
3.4.1 流程实例(执行流)表26
3.4.2 流程任务表27
3.4.3 流程参数表27
3.4.4 流程与身份关系表27
3.4.5 工作数据表28
3.4.6 事件描述表28
3.5 历史数据表28
3.5.1 流程实例表28
3.5.2 流程明细表29
3.5.3 历史任务表和历史行为表29
3.5.4 附件表和评论表29
3.6 DMN规则引擎表30
3.6.1 决策部署表30
3.6.2 决策表30
3.6.3 部署资源表30
3.7 本章小结30
第4章 Activiti流程引擎配置31
4.1 流程引擎配置对象32
4.1.1 读取默认的配置文件32
4.1.2 读取自定义的配置文件33
4.1.3 读取输入流的配置33
4.1.4 使用createStandaloneInMemProcess- EngineConfiguration方法34
4.1.5 使用createStandaloneProcessEngine- Configuration方法34
4.2 数据源配置35
4.2.1 Activiti支持的数据库35
4.2.2 Activiti与Spring35
4.2.3 JDBC配置35
4.2.4 DBCP数据源配置36
4.2.5 C3P0数据源配置37
4.2.6 Activiti其他数据源配置38
4.2.7 数据库策略配置38
4.2.8 databaseType配置39
4.3 其他属性配置40
4.3.1 history配置40
4.3.2 asyncExecutorActivate配置41
4.3.3 邮件服务器配置41
4.4 ProcessEngineConfiguration bean41
4.4.1 ProcessEngineConfiguration及其子类41
4.4.2 自定义ProcessEngineConfiguration42
4.5 Activiti的命令拦截器43
4.5.1 命令模式44
4.5.2 责任链模式45
4.5.3 编写自定义拦截器47
4.6 本章小结49
第5章 流程引擎的创建50
5.1 ProcessEngineConfiguration的buildProcessEngine方法51
5.2 ProcessEngines对象51
5.2.1 init方法与getDefaultProcessEngine方法51
5.2.2 registerProcessEngine方向和unregister方法52
5.2.3 retry方法53
5.2.4 destroy方法53
5.3 ProcessEngine对象54
5.3.1 服务组件54
5.3.2 关闭流程引擎55
5.3.3 流程引擎名称56
5.4 本章小结56
第6章 用户组与用户57
6.1 用户组管理58
6.1.1 Group对象58
6.1.2 创建用户组58
6.1.3 修改用户组59
6.1.4 删除用户组60
6.2 Activiti数据查询61
6.2.1 查询对象61
6.2.2 list方法61
6.2.3 listPage方法62
6.2.4 count方法63
6.2.5 排序方法63
6.2.6 ID排序问题64
6.2.7 多字段排序66
6.2.8 singleResult方法67
6.2.9 用户组数据查询68
6.2.10 原生SQL查询69
6.3 用户管理71
6.3.1 User对象71
6.3.2 添加用户71
6.3.3 修改用户72
6.3.4 删除用户72
6.3.5 验证用户密码73
6.3.6 用户数据查询74
6.3.7 设置认证用户75
6.4 用户信息管理77
6.4.1 添加和删除用户信息77
6.4.2 查询用户信息78
6.4.3 设置用户图片78
6.5 用户组与用户的关系80
6.5.1 绑定关系80
6.5.2 解除绑定81
6.5.3 查询用户组下的用户81
6.5.4 查询用户所属的用户组82
6.6 本章小结83
第7章 流程存储84
7.1 流程文件部署85
7.1.1 Deployment对象85
7.1.2 DeploymentBuilder对象85
7.1.3 添加输入流资源86
7.1.4 添加classpath资源87
7.1.5 添加字符串资源88
7.1.6 添加压缩包资源88
7.1.7 添加BPMN模型资源89
7.1.8 修改部署信息90
7.1.9 过滤重复部署90
7.1.10 取消部署时的验证92
7.2 流程定义的管理93
7.2.1 ProcessDefinition对象93
7.2.2 流程部署93
7.2.3 流程图部署95
7.2.4 流程图自动生成95
7.2.5 中止与激活流程定义96
7.2.6 流程定义缓存配置97
7.2.7 自定义缓存98
7.3 流程定义权限100
7.3.1 设置流程定义的用户权限100
7.3.2 设置流程定义的用户组权限101
7.3.3 IdentityLink对象102
7.3.4 查询权限数据102
7.4 RepositoryService数据查询与删除104
7.4.1 查询部署资源104
7.4.2 查询流程文件105
7.4.3 查询流程图106
7.4.4 查询部署资源名称107
7.4.5 删除部署资源107
7.4.6 DeploymentQuery对象108
7.4.7 ProcessDefinitionQuery对象109
7.5 本章小结109
第8章 流程任务管理110
8.1 任务的创建与删除111
8.1.1 Task接口111
8.1.2 创建与保存Task实例112
8.1.3 删除任务112
8.2 任务权限113
8.2.1 设置候选用户组114
8.2.2 设置候选用户115
8.2.3 权限数据查询116
8.2.4 设置任务持有人118
8.2.5 设置任务代理人119
8.2.6 添加任务权限数据119
8.2.7 删除用户组权限121
8.2.8 删除用户权限122
8.3 任务参数123
8.3.1 基本类型参数设置124
8.3.2 序列化参数125
8.3.3 获取参数126
8.3.4 参数作用域127
8.3.5 设置多个参数128
8.3.6 数据对象129
8.4 任务附件管理130
8.4.1 Attachment对象130
8.4.2 创建任务附件130
8.4.3 附件查询132
8.4.4 删除附件133
8.5 任务评论与事件记录133
8.5.1 Comment对象133
8.5.2 新增任务评论134
8.5.3 事件的记录135
8.5.4 数据查询136
8.6 任务声明与完成137
8.6.1 任务声明137
8.6.2 任务完成138
8.7 本章小结139
第9章 流程控制140
9.1 流程实例与执行流141
9.1.1 流程实例与执行流概念141
9.1.2 流程实例和执行流对象(ProcessInstance与Execution)141
9.2 启动流程142
9.2.1 startProcessInstanceById方法142
9.2.2 startProcessInstanceByKey方法144
9.2.3 startProcessInstanceByMessage145
9.3 流程参数146
9.3.1 设置与查询流程参数147
9.3.2 流程参数的作用域147
9.3.3 其他设置参数的方法149
9.4 流程操作149
9.4.1 流程触发149
9.4.2 触发信号事件150
9.4.3 触发消息事件152
9.4.4 中断与激活流程153
9.4.5 删除流程154
9.5 流程数据查询155
9.5.1 执行流查询155
9.5.2 流程实例查询157
9.6 本章小结158
第10章 历史数据管理和流程引擎管理159
10.1 历史数据管理160
10.1.1 历史流程实例查询160
10.1.2 历史任务查询161
10.1.3 历史行为查询163
10.1.4 历史流程明细查询165
10.1.5 删除历史流程实例和历史任务166
10.2 工作的产生167
10.2.1 异步任务产生的工作168
10.2.2 定时中间事件产生的工作169
10.2.3 定时边界事件产生的工作170
10.2.4 定时开始事件产生的工作171
10.2.5 流程抛出事件产生的工作172
10.2.6 暂停工作的产生174
10.2.7 无法执行的工作175
10.3 工作管理176
10.3.1 工作查询对象176
10.3.2 获取工作异常信息176
10.3.3 转移与删除工作177
10.4 数据库管理178
10.4.1 查询引擎属性178
10.4.2 数据表信息查询179
10.4.3 数据库操作180
10.4.4 数据表查询180
10.5 本章小结181
第11章 流程事件182
11.1 事件分类183
11.1.1 按照事件的位置分类183
11.1.2 按照事件的特性分类183
11.2 事件定义183
11.2.1 定时器事件定义184
11.2.2 cron表达式184
11.2.3 错误事件定义186
11.2.4 信号事件定义186
11.2.5 消息事件定义187
11.2.6 取消事件定义187
11.2.7 补偿事件定义188
11.2.8 其他事件定义188
11.3 开始事件188
11.3.1 无指定开始事件188
11.3.2 定时器开始事件189
11.3.3 消息开始事件190
11.3.4 错误开始事件191
11.4 结束事件193
11.4.1 无指定结束事件193
11.4.2 错误结束事件194
11.4.3 取消结束事件和取消边界事件196
11.4.4 终止结束事件199
11. 5 边界事件200
11.5.1 定时器边界事件201
11.5.2 错误边界事件203
11.5.3 信号边界事件204
11.5.4 补偿边界事件206
11.6 中间事件209
11.6.1 中间事件分类209
11.6.2 定时器中间事件