BPMN2.0(Business Process Modeling Notation 2.0,译为:业务流程模型注解 Version2.0)是业务流程模型的一种标准注解,这个标准是由OMG(Objecgt Management Group,译为:对象管理组织,官网:OMG Standards for Industries | Object Management Group)。
规范定义了流程定义的标准,哪些节点元素可以与哪些另外的节点元素相连等。BPMN2.0版本除了早期定义的标准化图形和元素,还制定了元素的执行语法,通过使用XML语言来指定业务流程的执行语法,这种业务流程的语言,可以执行在任何兼容BPMN2.0的流程引擎中。
目录导航
- 1流程根元素
- 2基本结构
- 2.1事件
- 2.2顺序流
- 2.2.1存在分支的多外向顺序流
- 2.2.1.1给顺序流添加条件
- 2.2.1存在分支的多外向顺序流
- 2.3网关
- 2.4任务
- 2.4.1任务:人工任务User Task
- 2.4.2任务:Java服务任务Service Task
- 2.4.3任务:手工任务ManualTask
- 2.4.4任务:java接收任务Receive Task
流程根元素
一个BPMN2.0的流程的根是definition元素,在命名状态下,子元素会包含真正的流程定义。每个process子元素,可以拥有一个id(必填)和一个name(可选)。一个空的bpmn2.0业务流程看起来是这样的:
< definitions id = "myProcesses"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://schema.omg.org/spec/BPMN/2.0 BPMN20.xsd"
xmlns = "http://schema.omg.org/spec/BPMN/2.0"
typeLanguage = "http://www.w3.org/2001/XMLSchema"
expressionLanguage = "http://www.w3.org/1999/XPath"
targetNamespace = "http://jbpm.org/example/bpmn2"
>
< process id = "My business processs" name = "myBusinessProcess" >
<!-- 流程定义主体 -->
</ process >
< definitions >
|
definition元素中定义了一些命名空间(具体可以看下这篇XML文档里面的标签属性 - 学习学习学而时习 - 博客园 (cnblogs.com));
process元素属性定义了name,它会被用作流程的key,没有指定name,id会被用作key。可以通过这个key来启动一个流程实例(executionService.startProcessInstanceByKey("myBusinessProcess")、搜索一个流程定义,这个key的规则是,其中的空格和非字母数字的字符会被下划线代替。
基本结构
事件
典型的业务,通常使用这种事件驱动的方式。类似于这种描述:
当我接收到客户的订单,这个流程就启动
如果两天内任务没结束,就终止流程
……
在BPMN规范中,描述了很多的事件类型。
事件:流程启动事件
- 启动事件表示一个流程的开始(或子流程的开始);
- 流程图中的表现是一个圆圈:
;
- 有时圆圈内部会有一个小图标,代表启动事件的实际类型,会在流程实例创建时被触发:
;
- 一个空开始事件的定义,id是必填的,name是可选的::
< process id = "noneStartEndEvent" name = "BPMN2 Example none start and end event" >
< startEvent id = "start" name = "myStart" />
</ process >
|
事件:流程结束事件
- 结束事件指定了流程实例中一个流程路径的结束;
- 图形上,它看起来就是一个圆 拥有厚边框(可能):
;
- 内部小图标指定结束时会执行的事件:
;
- 空结束事件可以像下面一样定义,id是必填的,name是可选的:
< process id = "noneStartEndEvent" name = "BPMN2 Example none start and end event" >
< endEvent id = "end" name = "myEnd" />
</ process >
|
顺序流
顺序流是指事件、活动和网关之间的连线;
图形上是一条带有当方向箭头的实线;
每个顺序流都有一个源头和一个目标的引用,引用的是线段两个端点活动、事件或者网关的id;
这个流程图对应的可执行文件如下:
< process id = "noneStartEndEvent" name = "BPMN2 Example none start and end event" >
< startEvent id = "start" />
< sequenceFlow id = "flow1" name = "fromStartToEnd" sourceRef = "start" targetRef = "end" />
< endEvent id = "end" name = "End" />
</ process >
|
存在分支的多外向顺序流
在下面这种情况中,完成第一个任务,会激活3个任务:
给顺序流添加条件
为了避免使用一个顺序流,必须添加condition条件到顺序流中,在运行时,只有当condition条件为true的时候,顺序流才会被执行;
给顺序流添加条件用conditionExpression 元素,条件放在${}中:
< process id = "noneStartEndEvent" name = "BPMN2 Example none start and end event" >
< startEvent id = "start" />
< sequenceFlow id = "flow1" name = "fromStartToEnd" sourceRef = "start" targetRef = "end" >
< conditionExpression xsi:type = "tFormalExpression" >${amount >= 500}</ conditionExpression >
< conditionExpression default></ conditionExpression > // 默认顺序流,默认顺序流上的表达式会被忽略
</ sequenceFlow >
< endEvent id = "end" name = "End" />
</ process >
|
网关
网关是用来控制流程的流向的。当一个token到达网关,他会根据网关的类型进行合并或者切分。
网关在流程图中表现为一个菱形,内部图标指定网关的类型(并行、相容等):
< process id = "noneStartEndEvent" name = "BPMN2 Example none start and end event" >
< parallelGateway id = "myJoin" name = "My synchronizing join" gatewayDirection = "converging" />
</ process >
|
唯一网关:
并行网关:在流程启动后, 'prepare shipment' 和 'bill customer'用户任务都会被激活。
包含网关:
可以区分下面的情况:
- 现金多于10000,不是国外银行:只有 "Large deposit" 任务会被激活。
- 现金多于10000,是国外银行: "Large deposit" 和 "Foreign deposit" 任务会被激活。
- 现金少于10000,是国外银行: 只有 "Foreign deposit" 任务会被激活。
- 现金少于10000,不是国外银行: 在这种情况 所有表达式的结果都是false,默认的顺序流会被选择。 在这个例子中国,这意味着"Standard deposit"任务会被激活。
任务
一个任务表示工作需要被外部实体完成。
任务在流程图中表现为圆角矩形:
内部左上角一般包含一个图标,表示任务的类型:
< process id = "noneStartEndEvent" name = "BPMN2 Example none start and end event" >
< userTask id = "myTask" name = "My task" />
</ process >
|
任务:人工任务User Task
当流程执行到这样的一个任务,一个新的人工任务会被创建,出现在相应的用户的任务列表中
任务的执行人可以是指定的用户、用户组
< process id = "noneStartEndEvent" name = "BPMN2 Example none start and end event" >
< userTask id = "myTask" name = "My task" >
< potentialOwner resourceRef = "manager" jbpm:type = "group" > // jbpm:type="group" 定义这是一个用户组的分配方式;当分配方式应该是候选用户时, 只需要使用jbpm:type="user"属性
< resourceAssignmentExpression >
< formalExpression >management</ formalExpression > // management用户组
</ resourceAssignmentExpression >
</ potentialOwner >
</ userTask >
</ process >
|
定义management用户组:Peter和Mary都可以在他们的任务列表中看到这条任务;
identityService.createGroup("management");
identityService.createUser("peter", "Peter", "Pan");
identityService.createMembership("peter", "management");
identityService.createUser("mary", "Mary", "Littlelamb");
identityService.createMembership("mary", "management");
List< Task > tasks = taskService.findGroupTasks("peter");
assertEquals(1, tasks.size());
tasks = taskService.findGroupTasks("mary");
assertEquals(1, tasks.size());
// Mary claims the task
Task task = tasks.get(0);
taskService.takeTask(task.getId(), "mary");
assertNull(taskService.createTaskQuery().candidate("peter").uniqueResult());
taskService.completeTask(task.getId());
assertProcessInstanceEnded(processInstance);
|
任务:Java服务任务Service Task
Service Task是一个自动活动,它会调用一些服务, 比如web service,java service等等。
任务:手工任务ManualTask
在真实世界里,有很多例子: 安装一个电话系统,使用定期邮件发送一封信, 用电话联系客户,等等。
手工任务的目标更像 文档/建模提醒的,因为它 对流程引擎的运行没有任何意义,因此,当流程引擎遇到一个手工任务时 会简单略过。
任务:java接收任务Receive Task
Receive Task是一个任务会等到外部消息的到来。
标签:end,name,流程,记录,process,BPMN2.0,规范,任务,id From: https://www.cnblogs.com/nicolelhh/p/16695960.html