流程定义语言(BPMN)

1.什么是BPMN

业务流程建模与标注(Business Process Model and Notation,BPMN) ,描述流程的基本符号,包括这些图元如何组合成一个业务流程图(Business Process Diagram)

Eclispse画出流程,有两个文件bpmn文件和png文件,其中bpmn文件又可以叫做流程定义文件,它需要遵循BPMN语言规范.png:就是一个单纯的图片,没有任何作用.

2.什么是流程

bpmn文件一个流程的根元素。一个流程就代表一个工作流。

3.顺序流(sequenceFlow)

3.1什么是顺序流
顺序流是连接两个流程节点的连线,代表一个节点的出口。流程执行完一个节点后,会沿着节点的所有外出顺序流继续执行。 就是说,BPMN 2.0默认的行为就是并发的: 两个外出顺序流会创造两个单独的,并发流程分支。
3.2顺序流的属性
Id: 唯一标示,用来区分不同的顺序流
sourceRef:连线的源头节点ID
targetRef:连线的目标节点ID
name(可选):连线的名称,不涉及业务,主要用于显示。多出口原则要设置。
3.3分支流程流程图

准备开启流程

请假人设置请假天数
/**
* zs 完成任务
* @throws Exception
/
@Test
public void compleTask() throws Exception {
Map<String, Object>map=new HashMap<>();
map.put(“days”, 2);
compleTaskByPIdAndName(“2501”, “zs”,map);
}
//审批人审核,判断
/
*
* ls 完成任务
* @throws Exception
*/
@Test
public void compleTaskls() throws Exception {
//String taskId=“5003”;
String pid=“2501”;
String name=“ls”;
Map<String, Object> variables = taskService.getVariables(queryTaskByName(pid, name).getId());
// 获取天数
Integer days = (Integer) variables.get(“days”);
System.out.println(days>3);
if(days>3){
variables.put(“flag”, false);
}else{
variables.put(“flag”, true);
}
System.out.println(variables);
// 完成任务
//taskService.complete(taskId,variables);
compleTaskByPIdAndName(pid, name,variables);
}

4.网关节点

网关用来控制流程的流向。
网关显示成菱形图形,内部有有一个小图标。 图标表示网关的类型。

4.1排他网关(ExclusiveGateWay)
简单理解有多个分支,但是只能走一个分支。
排他网关(也叫异或(XOR)网关,或更技术性的叫法 基于数据的排他网关), 用来在流程中实现决策。
图形标记
排他网关显示成一个普通网关(比如,菱形图形), 内部是一个“X”图标,表示异或(XOR)语义。 注意,没有内部图标的网关,默认为排他网关。 BPMN 2.0规范不允许在同一个流程定义中同时使用没有X和有X的菱形图形。

XML内容
排他网关的XML内容是很直接的:用一行定义了网关, 条件表达式定义在外出顺序流中。 参考条件顺序流 获得这些表达式的可用配置。

它对应的XML内容如下:

说明:
1.一个排他网关对应一个以上的顺序流
2.由排他网关流出的顺序流都有个conditionExpression元素,在内部维护返回boolean类型的决策结果。
3.决策网关只会返回一条结果。当流程执行到排他网关时,流程引擎会自动检索网关出口,从上到下检索如果发现第一条决策结果为true或者没有设置条件的(默认为成立),则流出。
4.如果没有任何一个出口符合条件则抛出异常。

4.2并行网关(parallelGateWay)
多个分支要一起执行完,才算完成(会签)。
网关也可以表示流程中的并行情况。最简单的并行网关是parallelGateWay,它允许将流程 分成多条分支,也可以把多条分支 汇聚到一起。
图形标记
并行网关显示成一个普通网关(菱形)内部是一个“加号”图标, 表示“与(AND)”语义。

XML内容
定义并行网关只需要一行XML:

实际发生的行为(分支,聚合,同时分支聚合), 要根据并行网关的顺序流来决定。
参考如下代码:

<sequenceFlow id="flow1"sourceRef="theStart"targetRef=“fork”/> <parallelGatewayid=“fork”/> <sequenceFlowsourceRef="fork"targetRef=“receivePayment”/> <sequenceFlowsourceRef="fork"targetRef=“shipOrder”/>
<userTaskid="receivePayment"name=“Receive Payment”/> <sequenceFlowsourceRef="receivePayment"targetRef=“join”/>
<userTaskid="shipOrder"name=“Ship Order”/> <sequenceFlowsourceRef="shipOrder"targetRef=“join”/> <parallelGatewayid=“join”/> <sequenceFlowsourceRef="join"targetRef=“archiveOrder”/>
<userTaskid="archiveOrder"name=“Archive Order”/> <sequenceFlowsourceRef="archiveOrder"targetRef=“theEnd”/>
<endEventid=“theEnd”/>
上面例子中,流程启动之后,会创建两个任务:
ProcessInstancepi =runtimeService.startProcessInstanceByKey(“forkJoin”);
TaskQueryquery=taskService.createTaskQuery() .processInstanceId(pi.getId()) .orderByTaskName().asc();
Listtasks =query.list();
assertEquals(2,tasks.size()); Task task1 =tasks.get(0);
assertEquals(“Receive Payment”,task1.getName());Tasktask2 =tasks.get(1);
assertEquals(“Ship Order”,task2.getName());
当两个任务都完成时,第二个并行网关会汇聚两个分支,因为它只有一条外出连线, 不会创建并行分支, 只会创建归档订单任务。
说明:
1.并行网关的功能是基于进入和外出的顺序流的:
分支(fork): 并行后的所有外出顺序流,为每个顺序流都创建一个并发分支。
汇聚(join): 所有到达并行网关,在此等待的进入分支, 直到所有进入顺序流的分支都到达以后, 流程就会通过汇聚网关。
2.并行网关的进入和外出都是使用相同节点标示
3.如果同一个并行网关有多个进入和多个外出顺序流, 它就同时具有分支和汇聚功能。 这时,网关会先汇聚所有进入的顺序流,然后再切分成多个并行分支。
4.并行网关不会解析条件。 即使顺序流中定义了条件,也会被忽略。
并行网关不需要是“平衡的”(比如, 对应并行网关的进入和外出节点数目相等)。如图中标示是合法的:

5.执行监听器(ExecutionListener)

执行监听器可以执行外部java代码或执行表达式,当流程定义中发生了某个事件。 可以捕获的事件有:
流程实例的启动和结束。
选中一条连线。
节点的开始和结束。
网关的开始和结束。
中间事件的开始和结束。
开始时间结束或结束事件开始。
现在有这样一个简单流程,只包含开始、结束、接收任务和用户任务4个节点:

配置监听器,XML代码如下:

说明:
1.任务监听器支持以下属性:
event(必选):任务监听器会被调用的任务类型。 可能的类型为:
start:流程节点创建后触发。
end:当任务完成,并尚未从运行数据中删除时触发。
take:任务完成后,流程流出时触发
class:必须调用的代理类。 这个类必须实现org.activiti.engine.delegate.
ExecutionListener接口。实现类代码如下:

执行监听器配置可以放在以下三个地方,如图:

a)监听整个流程的启动和结束状态,配置为process节点的子元素,如图①
b)监听一个节点的启动和结束状态,配置为一个节点的子元素,如图②和③
c)监听一条连线的执行,配置在sequenceFlow节点的内部,只有task一种事件,如图④
启动流程测试代码如下:

结果如下:

6.任务监听器(TaskListener)

任务监听器可以在发生对应的任务相关事件时执行自定义java逻辑 或表达式。
任务监听器只能添加到流程定义中的用户任务中。在之前任务节点上添加任务监听:

说明:
1.任务监听器支持以下属性:
event(必选):任务监听器会被调用的任务类型。 可能的类型为:
create:任务创建并设置所有属性后触发。
assignment:任务分配给一些人时触发。 当流程到达userTask,assignment事件 会在create事件之前发生。 这样的顺序似乎不自然,但是原因很简单:当获得create时间时, 我们想获得任务的所有属性,包括执行人。
complete:当任务完成,并尚未从运行数据中删除时触发。
class:必须调用的代理类。 这个类必须实现org.activiti.engine.delegate.TaskListener 接口。Java代码如下:

2.运行测试代码得到结果:
流程结束,日志内容为:[Start start, Receive Task start, Receive Task end, Receive Task take, User Task start, User Task assignment, User Task create, User Task complete, User Task end, End end]
新添加的任务监听包裹在executionListener监听的内部,顺序为:execution Start–> task Assignment–>task Create–>task Complete–>execution End–>execution take。

流程定义语言(BPMN)相关推荐

  1. JAVAWEB开发之工作流详解(二)——Activiti核心API的使用(流程定义和流程实例的管理、流程变量、监听器...)以及与Spring的集成

    管理流程定义 设计流程定义文档 bpmn文件 设置方式可以直接使用插件图形化界面进行设置 为某任务节点指定任务执行者 保存后的BPMN文件可以使用XML编辑器打开 BPMN 2.0根节点是defini ...

  2. 实例创建流程_Activiti系列~3.流程定义

    流程定义是按照bpmn2.0标准去描述 业务流程,通常使用activiti-explorer(web控制台)或activiti-eclipse-designer插件对业务流程进行建模. 绘制流程,会生 ...

  3. activiti流程定义的部署

    import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.acti ...

  4. Activiti——管理流程定义(四)

    Activiti--管理流程定义 1.设计流程定义文档 1.1.流程图 1.2.bpmn文件 <?xml version="1.0" encoding="UTF-8 ...

  5. Activiti第二篇【管理流程定义、执行任务和流程实例、流程变量】

    tags: Activiti 上篇Activiti只是一个快速入门案例,这篇就讲定义.部署.查看任务等等的一些细节[涉及到的数据库表.对象等等]... 管理流程定义 管理流程定义主要涉及到以下的4张表 ...

  6. Spring中部署Activiti流程定义的三种姿势

    摘要:本文对工作流Activiti框架中流程定义的部署进行了详细说明介绍. 本文分享自华为云社区<项目中工作流部署详细解析!Spring中部署Activiti流程定义的三种姿势>,作者:攻 ...

  7. Activiti的流程定义文件解析

    2019独角兽企业重金招聘Python工程师标准>>> 在实现流程的模拟运行时,需获取流程定义中的相关活动节点信息,故需对流程定义文件进行解析. 此处对流程定义文件的解析,主要是通过 ...

  8. Activiti流程定义缓存源码分析8-流程缓存自定义原理

    上面我们浓墨重彩地讲述了自定义节点缓存类以及将其注入流程引擎配置类实例的过程,可能读者有个疑问?节点定义的缓存数据格式是什么呢?流程引擎执行节点的时候,又是如何获取并解析节点所缓存的数据呢?这也是接下 ...

  9. 带你学MySQL系列 | 什么是数据定义语言(DDL)呢?

    如果你是刚刚学习MySQL的小白,在你看这篇文章之前,请先看看下面这些文章.有些知识你可能掌握起来有点困难,但请相信我,按照我提供的这个学习流程,反复去看,肯定可以看明白的,这样就不至于到了最后某些知 ...

最新文章

  1. @ConfigurationProperties和@Value 注入
  2. Web开发中8个基础常见功能
  3. Android Studio 全面教程
  4. 借助财务客户评估解决方案在云中构建AppDev
  5. 不相关子查询的工作方式是_课题组工作|Nucleic Acids Research|基于表达密度谱的特征子空间分离及相关单细胞转录组分群新算法...
  6. ORM SQLAlchemy 简介
  7. 使用 idea 创建第一个 springboot 项目
  8. 《集体智慧编程》——第一章导读
  9. PPT制作基础知识(师从于珞珈老师)
  10. 计算机网络 ——物理层
  11. 方舟手游修改服务器难度,方舟手游中途可以修改难度吗
  12. Win10自动修复无法开机【完美解决】
  13. 工行智能客服服务量突破1.7亿笔;迪拜机场拟用人脸识别技术替代护照检查
  14. fzoj Problem 2190 非提的救赎 【单调栈】
  15. linux启动vnc端口,vnc server配置、启动、重启与连接,图形管理linux系统
  16. Linux技巧:使用Fsck命令修复损坏的分区
  17. Java 实现顺序表的基本操作
  18. 百度地图:新的瓦片生成工具来了
  19. 路缘石成型机使用技术更新后施工效果呈现的过程
  20. 什么是扩散模型(Diffusion Models),为什么它们是图像生成的一大进步?

热门文章

  1. 2021年秋季校招_软件技术_Java开发工程师_求职心得
  2. 关于华为DevEco studio2.0的安装和运行第一个hello world的文章
  3. 亲历华为手机丢失通过定位找回
  4. SAP help使用和下载官方文档教程
  5. USASCII7字符集导入ZHS16GBK字符集
  6. Crash监控的简单实现方案
  7. LeetCode 160. 相交链表
  8. 压缩算法——谷歌Webp
  9. java jre、jdk、server jre
  10. matlab 将矩阵中的NAN替换为0