《疯狂工作流讲义(第 2 版)基于 Activiti6.X》作者:杨恩雄
配套源码地址:http://pan.baidu.com/s/1eRHYf1C 提取密码: 06o2
教学视频地址:https://pan.baidu.com/s/12YjylKeDxKQtbV6uMf7TPQ 提取密码: r6pc
工作流引擎Activiti经过多年的发展,已经变成一个成熟的工作流框架,在2017年,Activiti推出了全新的6.0版本,除了完善对BPMN规范的支持外,还加入了对DMN规范的支持。为了能让广大的程序开发者一探新版本Activiti的功能,笔者在第一版的基础上,编写了本书的第二版。
书中会对Activiti的知识进行全面讲解,并从源码角度对Activiti进行深度剖析。本书会以Activiti为基础,讲述该框架的API使用、BPMN规范,除了这些工作流的基本知识外,还讲解了新的DMN规范引擎、Activiti整合SpringBoot等内容。在本书的第18章,深入Activiti的源代码,展示舍弃流程虚拟机(PVM)之后的Activiti,如何对流程进行控制,让读者能一窥Activiti的庐山真面目。zui后一章,以一个案例结束本书的内容,案例中整合Spring、Struts2等主流框架,目的是让读者在学习的过程中更贴近实际案例。
杨恩雄,从事十多年JavaEE企业应用开发,曾任中企动力系统设计师、中企开源项目经理、数码辰星科技公司项目经理,参与过多个企业级项目的设计与架构工作,曾负责辰星“电影票网络销售系统”的整体架构。精通Activiti、Drools、ESB等开源技术,在SOA、SaaS、大数据应用、互联网系统架构方面有着丰富的经验,曾出版《疯狂Java实战演义》《疯狂Workflow讲义》《疯狂SpringCloud微服务架构实战》等书籍。
- 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还是jBPM 5
- 1.4 本章小结 6
- 2.1 下载与运行Activiti 8
- 2.1.1 下载和安装JDK 8
- 2.1.2 下载和安装MySQL 9
- 2.1.3 下载和安装Activiti 10
- 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 下载Eclipse 17
- 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.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.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与Spring 35
- 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 bean 41
- 4.4.1 ProcessEngineConfiguration及其子类 41
- 4.4.2 自定义ProcessEngineConfiguration 42
- 4.5 Activiti的命令拦截器 43
- 4.5.1 命令模式 44
- 4.5.2 责任链模式 45
- 4.5.3 编写自定义拦截器 47
- 4.6 本章小结 49
- 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.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.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.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.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 startProcessInstanceByMessage 145
- 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.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.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
-
- 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 定时器中间事件 210
- 11.6.3 信号中间Catching事件 211
- 11.6.4 信号中间Throwing事件 213
- 11.6.5 消息中间事件 215
- 11.6.6 无指定中间事件 215
- 11.7 补偿中间事件 215
- 11.7.1 补偿执行次数 215
- 11.7.2 补偿的执行顺序 217
- 11.7.3 补偿的参数设置 220
- 11.8 本章小结 221
- 12.1 BPMN 2.0任务 223
- 12.1.1 任务的继承 223
- 12.1.2 XML约束 223
- 12.1.3 任务的类型 225
- 12.2 用户任务 226
- 12.2.1 分配任务候选人 226
- 12.2.2 分配任务代理人 228
- 12.2.3 权限分配扩展 228
- 12.2.4 使用任务监听器进行权限分配 229
- 12.2.5 使用JUEL分配权限 230
- 12.3 脚本任务 232
- 12.3.1 脚本任务 232
- 12.3.2 JavaScript脚本 233
- 12.3.3 Groovy脚本 234
- 12.3.4 设置返回值 235
- 12.3.5 JUEL脚本 236
- 12.4 服务任务 237
- 12.4.1 Java服务任务 238
- 12.4.2 实现JavaDelegate 238
- 12.4.3 使用普通Java Bean 240
- 12.4.4 在Activiti中调用Web Service 241
- 12.4.5 import元素 242
- 12.4.6 itemDefinition和message元素 242
- 12.4.7 interface与operation元素 243
- 12.4.8 设置Web Service参数与返回值 243
- 12.4.9 发布Web Service 243
- 12.4.10 使用Web Service Task 245
- 12.4.11 JavaDelegate属性注入 248
- 12.4.12 在JavaDelegate中调用Web Service 251
- 12.4.13 Shell任务 253
- 12.5 其他任务 255
- 12.5.1 手动任务和接收任务 255
- 12.5.2 邮件任务 257
- 12.5.3 Mule任务和业务规则任务 258
- 12.6 任务监听器 259
- 12.6.1 使用class指定监听器 259
- 12.6.2 使用expression指定监听器 260
- 12.6.3 使用delegateExpression指定监听器 261
- 12.6.4 监听器的触发 262
- 12.6.5 属性注入 263
- 12.7 流程监听器 263
- 12.7.1 配置流程监听器 263
- 12.7.2 触发流程监听器的事件 264
- 12.8 本章小结 267
- 13.1 子流程 269
- 13.1.1 嵌入式子流程 269
- 13.1.2 调用式子流程 271
- 13.1.3 调用式子流程的参数传递 273
- 13.1.4 事件子流程 275
- 13.1.5 事务子流程 277
- 13.1.6 特别子流程 280
- 13.2 顺序流 282
- 13.2.1 条件顺序流 282
- 13.2.2 默认顺序流 284
- 13.3 流程网关 286
- 13.3.1 单向网关 286
- 13.3.2 并行网关 288
- 13.3.3 兼容网关 291
- 13.3.4 事件网关 293
- 13.4 流程活动特性 295
- 13.4.1 多实例活动 295
- 13.4.2 设置循环数据 297
- 13.4.3 获取循环元素 298
- 13.4.4 循环的内置参数 300
- 13.4.5 循环结束条件 302
- 13.4.6 补偿处理者 304
- 13.5 本章小结 304
- 14.1 概述 306
- 14.1.1 规则引擎Drools 306
- 14.1.2 Drools下载与安装 306
- 14.2 开发第一个Drools应用 307
- 14.2.1 建立Drools环境 307
- 14.2.2 编写规则 308
- 14.2.3 加载与运行 308
- 14.3 Drools规则语法概述 309
- 14.3.1 规则文件结构 309
- 14.3.2 关键字 310
- 14.3.3 规则编译 310
- 14.4 类型声明 311
- 14.4.1 声明新类型 312
- 14.4.2 使用ASM操作字节码 313
- 14.4.3 类型声明的使用 314
- 14.4.4 类型的继承 316
- 14.4.5 声明元数据 317
- 14.5 函数和查询 317
- 14.5.1 函数定义和使用 318
- 14.5.2 查询的定义和使用 320
- 14.6 规则语法 321
- 14.6.1 全局变量 322
- 14.6.2 规则属性 323
- 14.6.3 条件语法 327
- 14.6.4 行为语法 330
- 14.7 Activiti调用规则 331
- 14.7.1 业务规则任务 332
- 14.7.2 制定销售单优惠规则 333
- 14.7.3 实现销售流程 336
- 14.8 本章小结 339
- 15.1 DMN规范概述 341
- 15.1.1 DMN的出现背景 341
- 15.1.2 Activiti与Drools 341
- 15.1.3 DMN的XML样例 341
- 15.2 DMN的XML规范 342
- 15.2.1 决策 342
- 15.2.2 决策表 343
- 15.2.3 输入参数 343
- 15.2.4 输出结果 344
- 15.2.5 规则 344
- 15.3 运行第一个应用 345
- 15.3.1 建立项目 345
- 15.3.2 规则引擎配置文件 346
- 15.3.3 编写DMN文件 346
- 15.3.4 加载与运行DMN文件 347
- 15.4 规则引擎API简述 348
- 15.4.1 创建规则引擎 348
- 15.4.2 配置规则引擎 349
- 15.4.3 数据查询 350
- 15.4.4 执行DMN文件 350
- 15.5 规则匹配 351
- 15.5.1 MVEL表达式简介 351
- 15.5.2 执行第一个表达式 351
- 15.5.3 使用对象执行表达式 352
- 15.5.4 规则引擎规则匹配逻辑 353
- 15.5.5 自定义表达式函数 354
- 15.5.6 Activiti中的自定义表达式函数 355
- 15.5.7 销售打折案例 357
- 15.6 本章小结 360
- 16.1 Spring Framework 362
- 16.1.1 Spring的IoC 362
- 16.1.2 Spring的AOP 362
- 16.1.3 使用IoC 363
- 16.1.4 使用AOP 364
- 16.2 Activiti整合Spring 365
- 16.2.1 SpringProcessEngineConfiguration 365
- 16.2.2 资源的部署模式 367
- 16.2.3 ProcessEngineFactoryBean 367
- 16.2.4 在bean中注入Activiti服务 368
- 16.2.5 在Activiti中使用Spring的bean 369
- 16.3 Activiti整合Web项目 371
- 16.3.1 安装Tomcat插件 371
- 16.3.2 加入Spring 373
- 16.3.3 整合Hibernate 375
- 16.3.4 配置声明式事务 377
- 16.3.5 添加Struts配置 378
- 16.3.6 实现一个最简单的逻辑 378
- 16.3.7 测试事务 380
- 16.3.8 添加Activiti 380
- 16.4 Activiti与Spring Boot 381
- 16.4.1 Spring Boot项目简介 381
- 16.4.2 下载与安装Maven 382
- 16.4.3 开发第一个Web应用 383
- 16.4.4 Activiti与Spring Boot的整合 386
- 16.5 Activiti与JPA 388
- 16.5.1 建立与运行JPA项目 388
- 16.5.2 在Activiti中使用JPA 390
- 16.5.3 Activiti、Spring与JPA的整合 391
- 16.5.4 基于JPA的例子 393
- 16.6 本章小结 395
- 17.1 Web Service简介 397
- 17.1.1 Web Service 397
- 17.1.2 SOAP协议 397
- 17.1.3 REST架构 397
- 17.1.4 REST的设计准则 398
- 17.1.5 REST的主要特性 398
- 17.1.6 SOAP RPC与REST的区别 399
- 17.2 使用Sping MVC发布REST 399
- 17.2.1 在Web项目中加入Spring MVC 400
- 17.2.2 发布REST的Web Service 401
- 17.2.3 使用Restlet编写客户端 402
- 17.2.4 使用CXF编写客户端 402
- 17.2.5 使用HttpClient编写客户端 403
- 17.2.6 准备测试数据 403
- 17.2.7 部署Activiti的Web Service 403
- 17.2.8 接口访问权限 404
- 17.2.9 访问Activiti接口 404
- 17.3 流程存储服务 405
- 17.3.1 上传部署文件 405
- 17.3.2 部署数据查询 406
- 17.3.3 部署资源查询 406
- 17.3.4 查询单个部署资源 407
- 17.3.5 删除部署 408
- 17.4 本章小结 409
- 18.1 流程控制逻辑 411
- 18.1.1 概述 411
- 18.1.2 设计流程对象 411
- 18.1.3 创建流程节点行为类 413
- 18.1.4 编写业务处理类 414
- 18.1.5 将流程XML转换为Java对象 414
- 18.1.6 编写客户端代码 416
- 18.2 Activiti的表单 416
- 18.2.1 概述 416
- 18.2.2 表单属性 417
- 18.2.3 外部表单 418
- 18.2.4 关于动态工作流和动态表单 419
- 18.3 流程图XML 419
- 18.3.1 节点元素 419
- 18.3.2 衔接元素 420
- 18.3.3 流程图与流程文件的转换 420
- 18.4 流程操作 421
- 18.4.1 流程回退 421
- 18.4.2 会签 422
- 18.5 本章小结 424
- 19.1 使用技术 426
- 19.1.1 表现层技术 426
- 19.1.2 MVC框架 426
- 19.1.3 Spring和Hibernate 426
- 19.2 功能简述 427
- 19.2.1 系统的角色管理 427
- 19.2.2 薪资计算流程 427
- 19.2.3 请假流程 427
- 19.2.4 薪资调整流程 427
- 19.2.5 报销流程 428
- 19.3 框架整合 428
- 19.3.1 创建Web项目 428
- 19.3.2 整合Spring 429
- 19.3.3 整合Hibernate 430
- 19.3.4 整合Struts2 432
- 19.3.5 整合Activiti 433
- 19.4 数据库设计 434
- 19.4.1 薪资表 434
- 19.4.2 请假记录表 434
- 19.4.3 薪资调整记录表 435
- 19.4.4 报销记录表 436
- 19.5 初始化数据 437
- 19.5.1 初始化角色数据 437
- 19.5.2 薪资计算流程 438
- 19.5.3 请假流程 439
- 19.5.4 报销流程 439
- 19.5.5 薪资调整流程 440
- 19.6 角色管理 441
- 19.6.1 用户组管理 442
- 19.6.2 用户列表 443
- 19.6.3 新建用户 445
- 19.6.4 用户登录 446
- 19.7 流程启动 447
- 19.7.1 启动请假流程 447
- 19.7.2 启动报销流程 450
- 19.7.3 启动薪资调整流程 452
- 19.8 申请列表 453
- 19.8.1 申请列表的实现 453
- 19.8.2 请假申请列表 454
- 19.8.3 报销申请列表 455
- 19.8.4 薪资调整列表 455
- 19.8.5 查看流程图 456
- 19.9 流程任务 457
- 19.9.1 待办任务列表 457
- 19.9.2 领取任务与受理任务列表 459
- 19.9.3 查询任务信息 460
- 19.9.4 任务审批 462
- 19.9.5 运行OA的流程 463
- 19.10 本章小结 463