首页 > 其他分享 >BPMN2.0 规范学习记录

BPMN2.0 规范学习记录

时间:2022-09-20 09:36:30浏览次数:472  
标签:end name 流程 记录 process BPMN2.0 规范 任务 id

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的流程引擎中。

目录导航

 

 

流程根元素

一个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

相关文章