什么是 BPMN ?为什么我们要用 BPMN 和工作流 ?
BPMN 和 Activiti 介绍
工作流介绍
在任何行业和企业中,都有各种各样的流程,例如:
- 请假流程
- 报销流程
- 入职流程
- 离职流程
- 出差流程
- 等等……
就算你自己没有设计过工作流,那么你每天肯定也在使用各种流程。
为什么要用 BPMN ?
对于流程控制,有一种比较初级的玩法是:在业务代码里面加入 Status(状态机) 字段维护流程状态,流程负责的审批人可能也是 Hard Code(硬编码),这种玩法实现流程初级会比较快,但是长远来看会出现几个问题:
- 流程健壮性差,但凡出现人员变动,或者组织结构调整,就需要修改代码,维护成本高
- 流程无法复用,当组织出现新的工作流程,又要重新写一套代码,开发成本非常高
- 流程和业务代码耦合,你中有我,我中有你(并不符合单一职责和解耦的设计原则)
BPMN:业务流程模型和标记法 工作流(Workflow)是对各个行业的流程进行抽象,例如电信、软件、制造、金融和办公自动化领域。为了给全部业务的参与者提供易于理解的标准标记法,由业务流程管理倡议组织 BPMI 开发出了“业务流程建模标记法” Business Process Modeling Notation, BPMN。 BPMI 组织 于 2005 年并入 OMG 国际规范组织(Object Management Group),当前 BPMN 规范由 OMG 组织进行维护。
为什么要遵循规范 ?
遵循市场行为
举例:我们日常的电池 有 7 号和 5 号标准,你当然可以生产一个 6 号的电池,有没有人买就没人知道了,如果你按标准生产出的电池,那么是可以直接用到大多数电器上,如果你生产 6 号电池,那么你只能自己开发 6 号电池的电器,且不说你这样的做法是否被市场和行业认可,另外搞那么多不同的标准出来对于消费者来说也是一种灾难,例如当年微软的 IE 和 FireFox 的两套标准让现在的开发人员多么痛苦就知道了。。
遵循行业的共识
目前主流的工作流厂商都是基于 BPMN 2.0 规范开发流程,想要自立规范之前也请完全掌握和了解目前的规范。


另外对于产品和业务人员也需要学习和理解 BPMN 的符号,从而可以对业务进行建模,可以看看人人都是产品经历这篇文章: 关于 BPMN 流程建模方法 ,从而可以利用现有的 BPMN 流程设计器工具快速对业务建模(无需自己开发),只需将导出的 *.bpmn 文件导入遵循 BPMN 规范的流程引擎内即可运行。充分利用行业的生态和工具。这就是遵循规范所带来的收益。
有没有银弹 ? (BPMN 的适用场景)
我们知道软件行业是没有银弹,任何工具都有适用场景,如果把一个工具放到一个不适应的场景内,那么最终起到事倍功半的效果,流程引擎也不是银弹,它是一个对于复杂流程和抽象和复用工具,对于那些工作流程多且复杂的业务系统,合理的使用流程引擎会大大降低我们对于工作流的开发成本和时间,并且最终交付的效果也会比自己开发流程引擎要好上许多。
但是如果你的业务系统没有那么多的工作流程,或者只有很简单的状态从 A -> B 的转移,那么引入流程引擎显然是 大马拉小车,费时费力不说,而且会造成简单的需求开发起来很麻烦,拉长开发周期时间,最终交付的效果也未必很好。所以选择合适的工具,就成了程序员最重要的选择。
Activiti 是应对大型系统的复杂流程的作战工具,小规模场景和流程不复杂的业务系统,不建议使用。
本章总结:为什么要用工作流引擎 ?
- 自行研发流程,把流程和业务耦合不仅导致代码开发、修改成本高,而且流程偏定制开发,无法复用,就好比你自己生产一个 6 号电池
- 通过流程引擎,可以以极低的成本,快速实现业务工作流,提高开发效率,而且久经生产考验的流程引擎,也比任何人从 0 开始写流程要可靠的多,流程引擎的功能并没有多特别,都可以通过逻辑代码实现的,流程引擎的核心功能在于高质量的复用,设计层面的解耦(设计思想,语言和技术栈无关)
- BPMN2.0 是行业规范,遵循行业标准,有众多成熟工具可以使用,例如 bpmn 流程设计工具等等……系统需要实现的工作流越多,使用工作流的收益就越大
- 流程引擎不是银弹,它只适用于工作流程多且复杂的大型业务系统,如果是流程逻辑简单的业务系统,那么不建议使用流程引擎

BPMN 规范介绍
由于 BPMN 1.0 规范广受欢迎,OMG (Object Management Group) 组织于2011年1月发布 BPMN 2.0 规范,BPMN 2.0 版本则继承了 1.0 版本的内容,并且注重流程执行语法和标准交换格式。
OMG 组织致力于维护 BPMN 规范的两个目标:
- 流程的可迁移性:BPMN 2.0 规范定义了业务流程的符号以及模型,并且为流程定义设定了转换格式,目的是为了让流程的定义实现可移植性,那么用户可以在不同的供应商环境中定义流程,并且这些 流程可以移植到其他遵守 BPMN 2.0 规范的供应商环境中。
- 解决简单和复杂的平衡:BPMN 想要解决流程设计和复杂需求中间寻找一个平衡点,可以让非技术人员建立简单并且易懂的业务流程模型,同时可以处理高度复杂的业务流程,因此要解决这两个矛盾的要求,需要在 BPMN 规范中定义标准的图形和符号。
四种基本要素
BPMN 2.0 的图形结构和要素,建议直接参考 WIKI 百科的答案,这里我就不搬运了:
2.0 的几点改进
相比 BPMN 1.0 主要有以下改进:
- 规范了流程元素的执行语法。
- 定义了流程模型和流程图的扩展机制。
- 细化了事件的组成。 扩展了参与者的交互定义。
- 定义了编排模型。
Activiti 介绍
Activiti 是目前国内比较主流的基于 BPMN 2.0 规范实现的工作流引擎,目前已经发布到 7.X 版本,并且已经开始实现 DMN 规范(决策与图形,后面会讲),另外关于工作流引擎还有一些比较老牌的玩家例如:JBPM 现在发展的也很不错,还有目前比较新兴的流程引擎:camunnda,flowable 目前看起来也潜力十足,他们都是遵循了 BPMN 2.0 规范,因为在国内应用的比较主流,所以这里我们这里重点介绍 Activiti
Activiti 出现和发展
这里简单介绍 JBPM 和 Activiti 的发展历史,有兴趣深究的自行去 Google 搜索
Activiti 的发展线路:
Tom Baeyens是 JBPM 的创始人,因为理念不合 Tom Baeyens 加入Alfresco公司后又发布了Activit 5- JBPM 因此放弃 JBPM 4 架构,完全基于 Drools Flow 重新开发
JBMP 5,但他们同样都支持 BPMN 2.0 规范 - 从正统的延续来看,
Activit 5更像是对 JBPM 3、JBPM 4 的延续,所以国内大多企业都选择Activit
JBPM、Activiti 区别
- JBPM 推翻历史架构,重新使用了 Drools Flow 作为工作流架构
- JBPM 采用的是 LGPL 开源协议,对源码修改需要商业授权
- Activiti 采用了更为宽松的 Apache License 2.0 协议
- ……(想到再补充)
官方的 Activiti 示例
官方发布的 Activiti 演示程序,可以首先通过该例子来了解 Activiti 大部分功能,包括:
- 流程定义
- 流程发布
- 动态表单
等等,通过这个示例程序,作为切入 Activiti 的引子,建立初步了解后,更有信心深入了解 Activiti 工作流引擎
下载和使用示例程序步骤:
- Activiti 6.0 示例程序
- 将示例程序 /wars 目录下的 3 个程序拷贝到 Tomcat/webapps 目录,然后启动 Tomcat 即可
- 访问示例程序:http://localhost:8080/activiti-app/#/ 输入默认账号:admin/test 访问即可
Activiti 目录 /wars 下的三个示例程序职责分工:
| 应用 | 说明 | 地址 | 默认账号 |
|---|---|---|---|
| activiti-app | 一个比较完善的流程引擎示例程序 | /activiti-app | admin/test |
| activiti-admin | 用于查看流程引擎中的主要数据 | /activiti-admin | admin/admin |
| activiti-rest | rest-api 应用 API,不再局限 Jar | /activiti-rest | kermit/kermit |
演示一个简易的工作流的几个步骤:
- 进入
activiti-app系统,为创建用户 - 设计一个简单的工作流,并且为流程节点绑定用户
- 创建 HR App 应用程序,设置包含请假流程,并且发布
- 员工进入 HR App 程序,提交一个请假申请
- 经理进入系统,并且同意员工的请假申请,示例流程完成
- 通过 activiti-admin 程序连接到 activiti-app 查看流程的历史
进入 activiti-app 系统,为创建用户

这里简单介绍三个菜单的主要功能:
- Kickstart App:定义应用程序,设计流程,建立程序和流程之间的关系
- Task App:管理示例程序的任务,例如:我的待办,发起流程等等
- Identity management:管理用户、用户组等信息
在 Identity management -> Users 菜单创建两个用户,用于模拟工作流:

在 Kickstart App -> Processes 创建简单的请假流程

值得注意的是需要为用户任务分配流程变量,我们这里简单起见直接绑定用户,如图:

最后我们在 Kickstart App -> Apps 创建一个应用程序,并且绑定刚才设计的请假流程,如图:

切记要发布流程,这样我们切换普通员工 jack 身份进入系统的时候,就能看到发布应用程序,并且可以发起请假申请了,如图:

今天身体有点不舒服,进入 HR App 发起请假申请,如图:

当我的请假申请提交的时候,任务就会自动发到经理那边,我们切换经理账号看看:

当经理点击完成后,流程走完,任务就自动结束了。
那么如果想要查看流程历史,就要借助 activiti-admin 这个演示程序了:
- 打开链接:http://localhost:8080/activiti-admin/ 进入首页
- 输入默认账号 admin/admin 就可以
- 首次进入要配置
activiti-app的信息
如图:

这里我们配置过就可以直接打开 Instance,就可以看到所有执行过的流程历史,点击流程实例就可以看到详细的历史信息,如图:

总结
本篇主要介绍:
- 工作流概念和发展
- BPMN 和 Activiti 的诞生和发展
- Activiti 官方示例程序的展示
- Activiti 配置功能展示
以上功能只是流程引擎的九牛一毛,希望通过以上示例程序可以更好的帮助大家建立信心,从而更好面对后面的进阶知识。更好的掌握 Activiti 和 BPMN 2.0 的世界。
什么是 BPMN ?为什么我们要用 BPMN 和工作流 ?的更多相关文章
- BPMN 2.0规范
.1. BPMN 2.0是什么呢? 业务流程模型注解(Business Process Modeling Notation - BPMN)是 业务流程模型的一种标准图形注解.这个标准 是由对象管理组( ...
- 10 BPMN PDF books, articles and brochures
转自:https://www.heflo.com/blog/bpm/bpmn-pdf/ If you are looking for more information about BPMN (Busi ...
- BPMN 2.0
BPMN 2.0 Business Process Model and Notation 业务流程模型和符号 https://www.omg.org/spec/BPMN/2.0.2/ bpmn-js ...
- Activiti中工作流的生命周期详细解析!一个BPMN流程示例带你认识项目中流程的生命周期
BPMN 2.0介绍 业务流程模型注解(BusinessProcess Modeling Notation - BPMN)是业务流程模型的一种标准图形注解.这个标准是由对象管理组(Object Man ...
- 一个BPMN流程示例带你认识项目中流程的生命周期
摘要:本文详细说明了在工作流Activiti框架中的BPMN流程定义整个运行的生命周期. 本文分享自华为云社区<本文详细说明了在工作流Activiti框架中的BPMN流程定义整个运行的生命周期& ...
- Activiti5.10简易教程一
Activiti5.10简易教程一 一搭建环境 1.1 JDK 6+ activiti 运行在版本 6 以上的 JDK 上.转到 Oracle Java SE 下载页面,点击按钮“下载 JDK ” ...
- Activiti 学习笔记记录(二)
上一篇:Activiti 学习笔记记录 导读:对于工作流引擎的使用,我们都知道,需要一个业务事件,比如请假,它会去走一个流程(提交申请->领导审批---(批,不批)---->结束),Act ...
- OpenWebFlow0.9用户手册与设计说明
1. OpenWebFlow概述 OpenWebFlow是基于Activiti扩展的工作流引擎.Activiti (官方网站http://activiti.org/,代码托管在https://g ...
- (2)java程序走一遍工作流activiti
工作流从流程定义到创建一个流程实例完成执行步骤 使用activi-designer创建一个流程定义(.bpmn结尾的文件) 将定义好的流程定义和生成的png图片通过RepositoryService( ...
随机推荐
- 激光雷达数据到云cloud
激光雷达数据到云cloud 在美国地质调查局的3D提升计划(3DEP)被激发到一个新的方式可用性宣布从3DEP仓库的访问和处理激光雷达点云数据. 3DEP一直在美国使用光检测和测距(激光)技术获取三维 ...
- GPU上如何优化卷积
GPU上如何优化卷积 本文将演示如何在TVM中编写高性能卷积实现.我们以平方大小的输入张量和滤波器为例,假设卷积的输入是大批量的.在本例中,使用不同的布局来存储数据,以实现更好的数据局部性.缓冲区布局 ...
- node和gulp版本的坑
现在node版本最新的稳定版在14+ 然后我在接手项目的时候使用gulp打包,怎么也打包不了,这个问题纠结了挺久,然后百度了下,发现版本的问题 node 12+ 以上的版本不兼容 gulp 3的版本 ...
- 3,java数据结构和算法:约瑟夫环出队顺序, 单向环形链表的应用
什么是约瑟夫环? 就是数小孩游戏: 直接上代码: 要实现这个,只需要理清思路就好了 孩子节点: class Boy{ int no;//当前孩子的编码 Boy next; // 下一节点 public ...
- Redis源码解析之跳跃表(一)
跳跃表(skiplist) 有序集合(sorted set)是Redis中较为重要的一种数据结构,从名字上来看,我们可以知道它相比一般的集合多了一个有序.Redis的有序集合会要求我们给定一个分值(s ...
- 深入理解JVM,7种垃圾收集器,看完我跪了
如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现.Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,因此不同的厂商.版本的虚拟机所提供的垃圾收集器都可能会有很大差别,并 ...
- mysql的优化_第十一篇(查询计划篇)
Mysql优化(出自官方文档) - 第十一篇(查询计划篇) 目录 Mysql优化(出自官方文档) - 第十一篇(查询计划篇) 1 EXPLAIN Output Format EXPLAIN Join ...
- Fiddler手机抓包配置指南
前言: 对于开发.测试而言,抓包工具绝对是我们日常测试找bug的必备神器.今天主要介绍的是如何配置Fiddler抓取移动端app请求.首先Fiddler是一个http协议调试代理工具,它能够记录并检查 ...
- .NET 云原生架构师训练营(Identity Server)--学习笔记
目录 OAuth 2.0 OpenID Connect QuickStart OAuth 2.0 概念 过程 通信 组件 示例代码 概念 OAuth 2.0 是一个授权协议,它允许软件应用代表(而不是 ...
- Vsftpd配置(Centos7)
6.1.Vsftpd介绍: 用于上传图片和使用 FTP 协议访问图片服务器. 解决分布式环境的图片访问问题,使用vsftpd对图片做统一管理. vsftpd 是"very secure FT ...