Activiti中工作流的生命周期详细解析!一个BPMN流程示例带你认识项目中流程的生命周期

Activiti中工作流的生命周期详细解析!一个BPMN流程示例带你认识项目中流程的生命周期

BPMN 2.0介绍

业务流程模型注解(BusinessProcess Modeling Notation - BPMN)是业务流程模型的一种标准图形注解.这个标准是由对象管理组(Object Management Group - OMG)维护的

BPMN规范的2.0版本允许添加精确的技术细节在BPMN的图形和元素中,同时制定BPMN元素的执行语法.通过使用XML语言来指定业务流程的可执行语法,BPMN规范已经演变为业务流程的语言,可以执行在任何兼容BPMN2的流程引擎中,同时依然可以使用强大的图形注解

简单来说,BPMN即图标与标签的结合

在这里插入图片描述

在这里插入图片描述


在这里插入图片描述

定义一个流程

创建一个新的XML文件并命名,确认文件后缀为 .bpmn20.xml.bpmn, 否则引擎无法发布

BPMN 2.0根节点是definitions节点. 这个元素中,可以定义多个流程定义(不过建议每个文件只包含一个流程定义, 可以简化开发过程中的维护难度)

一个空的流程定义如下所示:注意definitions元素最少也要包含xmlns和 targetNamespace的声明

targetNamespace可以是任意值,它用来对流程实例进行分类

<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:activiti="http://activiti.org/bpmn" targetNamespace="Examples"> <process> .. </process> </definitions>

可以选择添加线上的BPMN 2.0格式位置:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL

process元素有两个属性:

id: 这个属性是必须的,对应着Activiti ProcessDefinition对象的key属性.id可以用来启动流程定义的流程实例,通过RuntimeServicestartProcessInstanceByKey方法

ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess");

注意: 它和startProcessInstanceById方法不同:这个方法期望使用Activiti引擎在发布时自动生成的id.可以通过调用processDefinition.getId() 方法获得这个值,生成的id的格式为 key:version, 最大长度限制为64个字符, 如果在启动时抛出了一个ActivitiException: 说明生成的id太长了,需要限制流程的key的长度

name: 这个属性是可选的, 对应ProcessDefinitionname属性.引擎自己不会使用这个属性,是用来在用户接口显示便于阅读的名称

BPMN流程示例前提

已经安装Activiti并且能够运行Activiti Demo

使用了独立运行的H2服务器

修改db.properties,设置其中的jdbc.url=jdbc:h2:tcp://localhost/activiti,然后启动独立服务器

目标

学习Activiti和一些基本的BPMN 2.0概念

最终结果是一个简单的Java SE程序可以发布流程定义,通过Activiti引擎API操作流程

使用一些Activiti相关的工具,构建自己的业务流程web应用

用例

每个月都要给公司领导一个金融报表,由会计部门负责

当报表完成时,一个上级领导需要审批文档,然后才能发给所有领导

流程图

流程的图形化BPMN 2.0标记:

在这里插入图片描述


空开始事件(左侧圆圈),后面是两个用户任务:制作月度财报和验证月度财报,最后是空结束事件(右侧粗线圆圈)

XML内容

在业务流程的XML中很容易找到流程的主要元素:

(空)开始事件是流程的入口

用户任务是流程中与操作者相关的任务声明:

第一个任务分配给accountancy组

第二个任务分配给management组

当流程达到空结束事件就会结束

这些元素都使用连线连接,这些连线拥有sourcetarget属性,定义了连线的方向

<definitions targetNamespace="http://activiti.org/bpmn20" xmlns:activiti="http://activiti.org/bpmn" xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"> <process> <startEvent /> <sequenceFlow sourceRef='theStart' targetRef='writeReportTask' /> <userTask > <documentation> Write monthly financial report for publication to shareholders. </documentation> <potentialOwner> <resourceAssignmentExpression> <formalExpression>accountancy</formalExpression> </resourceAssignmentExpression> </potentialOwner> </userTask> <sequenceFlow sourceRef='writeReportTask' targetRef='verifyReportTask' /> <userTask > <documentation> Verify monthly financial report composed by the accountancy department. This financial report is going to be sent to all the company shareholders. </documentation> <potentialOwner> <resourceAssignmentExpression> <formalExpression>management</formalExpression> </resourceAssignmentExpression> </potentialOwner> </userTask> <sequenceFlow sourceRef='verifyReportTask' targetRef='theEnd' /> <endEvent /> </process> </definitions> 启动一个流程实例

创建好业务流程的流程定义,就可以创建流程实例

一个流程实例对应了特定月度财报的创建和审批,所有流程实例都共享同一个流程定义

为了使用流程定义创建流程实例,首先要发布业务流程:

流程定义会保存到持久化的数据存储里,是为Activiti引擎特别配置的.所以部署好业务流程,在引擎重启后还能找到流程定义

BPMN 2.0流程文件会解析成内存对象模型, 可以通过Activiti API操作

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyxgfw.html