业务流程模型注解(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/MODELprocess元素有两个属性:
id: 这个属性是必须的,对应着Activiti ProcessDefinition对象的key属性.id可以用来启动流程定义的流程实例,通过RuntimeService的startProcessInstanceByKey方法
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess");注意: 它和startProcessInstanceById方法不同:这个方法期望使用Activiti引擎在发布时自动生成的id.可以通过调用processDefinition.getId() 方法获得这个值,生成的id的格式为 key:version, 最大长度限制为64个字符, 如果在启动时抛出了一个ActivitiException: 说明生成的id太长了,需要限制流程的key的长度
name: 这个属性是可选的, 对应ProcessDefinition的name属性.引擎自己不会使用这个属性,是用来在用户接口显示便于阅读的名称
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组
当流程达到空结束事件就会结束
这些元素都使用连线连接,这些连线拥有source和target属性,定义了连线的方向
<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操作