我们都知道用acitiviti进行开发的一个基本流程是:
1)使用bpmn符号画业务流程图——》对业务流程进行建模
2)部署业务流程——》将画好的业务流程图交给工作流引擎解析执行
3)启动流程实例
4)查询待办任务
5)办理待办任务(④、⑤可能会循环好几遍)
6)流程结束
第一步就是画流程图,但如果对bpmn符号不熟悉,画不出来流程图,就无法开展接下来的工作。一些特殊的业务流程,需要特殊的bpmn符号来处理,如果不知道这个bpmn符号的话,开发思路就会受到限制。所以无论是作为工作流开发任务还是业务人员,都有必须先了解一下bpmn规范。
个人认为activiti工作流引擎要分为两部分学习,第一个是BPMN2.0规范,第二个是activiti框架本身。他俩的关系是一个定义了规范,一个负责规范的实现,就好比JMS和ActiveMQ的关系、JDBC和各种数据库连接驱动的关系一样,先有规范后有具体的实现。规范通俗点讲,就是一个大家商量好的共同去遵守的东西,就跟各种协议似的。学会了规范再看具体实现的时候,思路脉络就会很清晰,就能知其所以然了。在计算机世界里面,规范很重要。
BPMN2.0(Business Process Model And Notation,业务流程模型和符号),是一种业务流程建模规范,提供了一套对业务流程建模的标记语言。起初由BPMI(The Business Process Management Initiative)在2004年推出BPMN1.0版本,后BPMI并入到OMG组织,OMG于2011年推出BPMN2.0标准。BPMN的主要目标是提供一套被所有业务用户容易理解和使用的标准符号,利用这些符号将业务流程建模简单化、图形化,将复杂的建模过程视觉化,让业务建模者、业务实施人员、管理监督人员对BPMN描述的业务流程有一个更加清晰明了的认识。从业务流程建模分析到流程的实现,直到最终用户的管理监控,BPMN2.0都贯穿其中。可以说BPMN在业务流程设计(业务流程图)与流程实现(工作流引擎)之间搭建了一条标准化的桥梁。一句话BPMN2.0帮助我们规范的画流程图。
ps:
bpmn2.0有一个很大的符号集合,如果业务流程比较简单,只需要了解几个关键的符号即可,当已知的bpmn符号无法满足业务需求时,再去学习更多的bpmn符号也不迟。
下面对bpmn符号进行一下简单介绍。
大致分为四类:
作用:用于对流程生命周期中发生的事件进行建模。
分类:
1.1.1 开始事件:开始事件指示流程从何处开始。
1)空开始事件
定义:没有启动事件,需要调用startProcessInstanceByXXX方法执行该空开始事件。
图形表示
XML表示
1.1.2 中间事件:
1.1.3 结束事件:标志着流程的结束。
1)空结束事件
定义:没有结束事件,当流程引擎检测到执行到该空结束事件时会自动执行,已结束整个流程。
图形表示
xml表示
4)边界事件:
定义:任务表示流程中具体要做的事情,通常一个任务表示工作需要被外部实体完成,比如人工任务和自动服务。
图形表示:任务通常有圆角矩形表示,内部文字为任务名称或描述,左上角的图标表示任务类型。
分类:
1.2.1 人工任务(user task)
定义:
最典型的任务。需要由人工来完成的任务,比如请假审批、财务审核等。
图形符号
xml表示
id是必须的,name是可选的,通过documentation元素对任务进行描述。任何bpmn2.0元素都可用documentation元素进行描述。
Schedule an engineering meeting for next week with the new hire.
到期日
可通过dueDate字段设置任务的到期时间。
用户分配
人工任务可分配给三种人:assignee(办理人、受让人),candidate(候选人),candidateGroup(候选人组)
》assignee是任务的实际办理人,任务只能同时有一个办理人。
》任务可以有多个候选人,每个候选人都能看到该任务,候选人需要claim(拾取)任务成为assignee后,才能进行任务的办理,任务被拾取后其他候选人就看不到该任务了。候选人在拾取任务后可以unclaim,将任务归还,此时其他候选人可以看到并claim任务。
》不想单独指定多个候选人,可以指定一个候选人组,一般为角色ID。
分配方式有三种:
1)画图时写死。
2)通过UEL表达式动态设置。
3)通过TaskListener监听器指定。
1.2.2 java服务任务(service task)
定义:
用于调用外部Java代码。
图形符号
xml表示
1.2.3 脚本任务(script task)
定义:
用于执行脚本文件(如javascript)
图形符号
xml表示
1.2.4 web服务任务
:用于调用外部web接口服务。
1.2.5 邮件任务(acticiti专有,非BPMN2.0规范)
:用于发送邮件。
还有手工任务、java接收任务、shell任务等。
作用:用来控制流程的流向。
图形表示:网关通常以菱形图形表示,内部带有一个图标。该图标显示网关的类型。
分类:
1.3.1 排他网关(exclusiveGateway)
定义
也叫XOR网关,对所有的传出分支进行条件判断,仅选择一个条件为true的分支执行,当有多个分支条件满足时,默认执行xml中定义的第一个。若多个分支条件都不满足时,就走默认顺序流。如果没有默认顺序流,将抛出异常。
图形符号
xml表示
1.3.2 并行网关(parallelGateway)
定义:
并行网关模拟多个同时并行执行的流程这种情况。两个特点:
1、具有fork-join行为(发散和汇聚,想起了java中的fork-join线程框架),即从并行网关传出的流程会并行执行,传入并行网关的流程会进入里面等待,知道并行的流程都进入到并行网关后,再一起发散出去。
2、并行网关忽略分支的条件判断。
图形符号
xml表示
包含网关(inclusiveGateway)
定义:
看作是排他网关和并行网关的组合,包含网关既能进行条件判断,又能并行执行多个分支。
图形符号
xml表示
还是事件网关等。
定义:顺序流就是事件,活动和网关之间的连线,显示为一条实线 带有箭头,在BPMN图形中每个顺序流都有一个源头和一个 目标引用,包含了 活动,事件或网关的id。
分类:
定义:
给顺序流添加表达式条件,当条件判断为true时,该顺序流将会被执行。这意味着如果多个顺序流的条件都为true时,会有多个顺序流并行执行。
图形符号:
XML表示
条件序列流在XML中表现为常规序列流,其中包含conditionExpression子元素。当前conditionalExpression仅可与UEL一起使用。
100 && order.price < 250}]]>
定义:
所有BPMN 2.0任务和网关都可以具有默认序列流。当且仅当其他条件顺序流都为false时,才选择执行默认顺序流。默认序列流的条件总是被忽略。
图形符号:
默认序列流是开始处带有斜杠标记的常规顺序流。
xml表示:
通过default属性执行默认顺序流。flow2为排他网关的默认顺序流。
${conditionA}
${conditionB}
本文章的目的,帮助大家了解BPMN2.0规范的内容,更好的画业务流程图,当你看到一个BPMN2.0符号时,能认识他、知道它的作用、知道怎样用xml来表示该符号就行了。
好了,BPMN2.0规范就先介绍这么多吧,灵活运用以上符号能解决70%的业务流程场景。如果有需要了解更多bpmn2.0规范的小伙伴,可以在评论区留言,我会适当的更新更多的内容。
参考:
Activiti User Guide
流程结构 | AWS BPMN2 Process参考指南
http://www.mossle.com/docs/jbpm4devguide/html/bpmn2.html
资源参考:
https://blog.csdn.net/qq_30739519/category_6186260.html
工作流选型
Activiti定时任务
工作流引擎之activiti6实时流程图追踪