1 写在前面
本文介绍了camunda 对BPMN流程定义文件的解析实现。
该类库的JS框架采用的dojo
(了解下dojo与jquery的区别:http://blog.csdn.net/dojotoolkit/article/details/7682978)
这个类库有四个文件
Bpmn.js提供相应功能的接口。
三个组件:Executor.js——轻量级流程引擎
Renderer.js——通过dojo展现渲染流程图的组件
Transformer.js——解析流程图的组件
最坑爹的是camunda首页的流程模拟是用jquery框架和Raphael图形处理库,因此确定,除了Renderer组件,其他组件都能复用。
camunda首页还采用了bootstrap框架,并且自己拓展了相关组件,值得借鉴。
2 结构
src
-bpmn
-Bpmn.js
-Executor.js
-Renderer.js
-Transforme.js
test
-bpmn
-engine
-lib
-renderer
-resources
-transformer
-util
-runner.html
3 各类接口
3.1 bpmn.js
renderUrl(url, options)通过url解析流程图
render(bpmnXml, options)通过字符串解析流程图
zoom(factor)放大缩小
annotate(id, innerHTML, classesArray)注释
clear()清除
例子:
new Bpmn().renderUrl("test/resources/task_loop.bpmn", {
diagramElement : "diagram",
overlayHtml : '<div style="position: relative; top:100%"></div>'
}).then(function (bpmn){
bpmn.zoom(0.8);
bpmn.annotate("reviewInvoice", '<span class="bluebox" style="position: relative; top:100%">New Text</span>', ["highlight"]);
//bpmn.clear();
});
3.2 Executor.js
CAM轻量级流程引擎核心
在这里定义了监听事件和公共方法,并注册了各种类型元素的执行行为。
接口
- ActivityExecution活动执行类
- ActivityExecution(activityDef,parentExecution) 构造函数
activityDef:流程定义
parentExecution:父执行
- bindVariableScope(scope) 绑定变量
scope:绑定变量到父执行
- executeActivities(activities) 执行多活动
activities:活动的数组
- executeActivity(activity, sequenceFlow) 执行活动
activity:当前活动
sequenceFlow:活动相关的顺序流
- invokeListeners (type, sequenceFlow) 调用监听
type:监听类型
sequenceFlow :监听类型绑定到顺序流
- getActivityInstance() 获得流程实例
以下是控制流程执行
- start 开始流程活动
记录开始时间,注册开始监听
- continue 执行活动
- end 结束流程活动
记录结束时间,注册结束监听
- takeAll 执行所有sequenceFlows连接的活动
- take 执行sequenceFlow连接的活动
注册TAKE监听
- signal 标记活动
如果活动定义了标记方法就执行,否则结束活动
- ActivityInstance活动实例类(是私有类,有以下属性)
- activityId 活动id
- isEnded 是否结束
- startDate 开始时间
- endDate 结束时间
- activities 未结束的活动们
异步调用
异步活动通过调用signal来控制执行
BPMN2.0中规定的活动元素应有的执行,通过注册活动类型来实现
抛出异常
3.3 Renderer.js
渲染器中内置了各个BPMN元素的render方法集放在Map中,并根据元素类型调用它们各自的render方法,用dojo的dom-construct生成dom节点。
3.4 Transformer.js
解析流程图的xml文件,返回含有元素集合的数组。
例子:
var processDefinition = new Transformer().transform(bpmn.bpmnXml)[0];
下面是processDefinition对象的样子:
其中的一个baseElement
4 实例
4.1 流程执行
var docXml = '<?xml version……'</definitions>';
var processDefinition = new Transformer().transform(docXml)[0];
var execution = new CAM.ActivityExecution(processDefinition);
execution.variables.input = 10;
execution.start();
//活动没结束
expect(execution.isEnded).toBe(false);
var processInstance = execution.getActivityInstance();
//expect(XXX).toBe(XXX2);是判断XXX是否等于XXX2的意思
//以下说明执行完的活动数量
expect(processInstance.activities.length).toBe(2);
expect(processInstance.activities[0].activityId).toBe("theStart");
expect(processInstance.activities[1].activityId).toBe("userTask");
// 为userTask发送一个信号
execution.activityExecutions[1].signal();
execution.activityExecutions[2].signal();
// 现在流程结束了
expect(execution.isEnded).toBe(true);
//以下说明流程实例的执行情况
processInstance = execution.getActivityInstance();
expect(processInstance.activities.length).toBe(4);
expect(processInstance.activities[0].activityId).toBe("theStart");
expect(processInstance.activities[1].activityId).toBe("userTask");
expect(processInstance.activities[3].activityId).toBe("theEnd");
解释:
execution定义了一个流程的执行。即为引擎中的ActivityExecution类。
execution.getActivityInstance()获取到了该执行的一个流程实例类activityInstance。
用户任务通过execution.activityExecutions[1].signal();方法来完成
该引擎支持多执行,多实例。
4.2 任务传参
当流程执行到某步时,我们想传递参数,可以通过对执行实例加监听来实现
var processDefinition = new Transformer().transform(docXml)[0];
//为流程定义增加监听
for (var i = 0; i < processDefinition.baseElements.length; i++) {
var activity = processDefinition.baseElements[i];
var listeners = activity.listeners;
if(!!activity.listeners) {
listeners.push({
"start" : function(activityExecution) {
var actId = activityExecution.activityDefinition.id;
console.log("start "+actId);
if(activityExecution.activityDefinition.type=="userTask"){
var lala = prompt("input lala","");
activityExecution.variables.lala = lala;
activityExecution.signal();
}
},
"end" : function(activityExecution){
var actId = activityExecution.activityDefinition.id;
console.log("end "+actId)
},
"signal" : function(activityExecution){
var actId = activityExecution.activityDefinition.id;
console.log("signal "+actId)
}
});
}
}
4.3 延迟加载
5 启发
5.1 可用性
流程定义对象的解析(Transformer)
流程预演功能(Executor)
分享到:
相关推荐
camunda-bpmn-js 基于可嵌入Camunda建模分布。用法该项目旨在提供不同的BPMN建模分布。 无需基于创建自定义Modeler实现,而是选择现有的软件包之一以反映产品的建模经验。 使用预先打包的发行版< link rel =" ...
该项目将BPMN 2.0的名称空间扩展定义为描述符。 用法 将其与一起使用以验证Camunda BPMN 2.0扩展。 var BpmnModdle = require ( 'bpmn-moddle' ) ; var camundaModdle = require ( 'camunda-bpmn-moddle/resources...
Camunda-bpmn
Camunda-bpmn BPMN实用示例和Camunda API推荐人
一个用于在单个流程中解析和执行BPMN模型的python模块到目前为止支持的元素: 开始/结束事件任务(手动,用户,服务)-暂时执行虚拟网关(专有,并行) 有条件的顺序流BPMN模型示例: 用法示例: import asynciofrom...
VUE + bpmn 流程设计器 demo方便大家,VUE + bpmn 流程设计器 demo方便大家
Camunda Modeler 基于BPMN与DMN集成建模解决方案。资源(另请参阅)构建应用程序在Posix环境中构建应用程序。 在Windows上是Git Bash或WSL。 # checkout a taggit checkout v1.1.0# install dependenciesnpm install...
基于wflow-web和smart-flow-design 仿钉钉Activiti Flowable Camunda RuoYi-Vue-Pro-Camunda 版本 前后台源代码(前后台都开源)
已完成节点高亮显示、当前执行中节点红色显示 支持一个节点多条流出线,包括通过、不通过、驳回、退回,按照已执行操作正确显示高亮流程线
这是一个示例,说明如何通过采用一组分布式微服务来建模Saga模式,并使用Camunda和BPMN对其进行异步编排。 它涉及3组独立组件。 Camunda平台运行 Camunda Modeler创建的BPMN模型 JavaScript微服务工作者 Camunda ...
生成文件Activiti不生效问题 原因: 在设置assignee和candidateUsers,candidateGroups时, activiti无法解析,只有将其前缀从...camunda-> activiti xml/bpmn and activiti->camunda xml/bpmn 运行ConversionUtil
camunda-bpmn-model-7.10.0.jar,camunda-bpm-spring-boot-starter-3.2.0.jar,camunda-bpm-spring-boot-starter-rest-3.2.0.jar,camunda-bpm-spring-boot-starter-test-3.2.0.jar,camunda-bpm-spring-boot-starter-...
该文件为本人博文中创建的【LeaveProcess】项目中的BPMN流程定义文件,由于篇幅较大,不适合出现在正文中,作为附件上传并提供下载链接。
BPMN全称业务流程建模与标注,作为一个标准,对于所有阅读者来说都有相同的含义. 即使是对于没有IT背景的业务人员,它也很容易理解. BPMN不能用来做什么 BPMN的设计出发点是对过程进行建模,展示事情的逻辑顺序,仅...
基于bpmn.js的流程图
业务模型和执行模型的一致性是当前服务组合研究...针对该问题,提出了一种基于业务流程建模标注的Web服务组合执行方案,设计了BPMN模型的解释执行算法,给出了执行引擎的原型系统,并通过具体案例验证了方案的有效性。
流程实现和执行组件:camunda engine(负责执行BPMN 2.0流程)、REST API、Spring/CDI集成 流程设计组件:camunda modeler、camunda cycle 流程操作组件:camunda engine、camunda cockpit 人工任务管理组件...
社区扩展助手库,用于可视化流程测试涵盖了BPMN流程的哪些部分。_camunda-process-test-covera.zip
BPMN2新规范 业界牛逼,流程建模设计,自动化,的工作流引擎