Fixflow引擎解析(二)(模型) - BPMN2.0读写
| Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素 |
| Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件 |
| Fixflow引擎解析(二)(模型) - BPMN2.0读写 |
| Fixflow引擎解析(一)(介绍) - Fixflow开源流程引擎介绍 |
1.关于BPMN2.0
网上的资料比较多下面引用一段维基百科对BPMN的定义:
业务流程建模标记法(BPMN, Business Process Modeling Notation)是对象管理组织(OMG, Object Management Group)
维护的关于业务流程建模的行业性标准。它建立在与UML的活动图非常相似的流程图法(flowcharting)基础上,
为“业务流程图”(BPD, Business Process Diagram)中的特定业务流程提供一套图形化标记法。BPMN的目标是,
通过提供一套既符合业务人员直观又能表现复杂流程语义的标记法,同时为技术人员和业务人员从事业务流程管理提供支持。
BPMN规范还提供从标记法的图到执行语言基础构造的映射,尤其是业务流程执行语言(BPEL, Business Process Execution Language)。
BPMN的首要目的是提供全体业务相关者易于理解的标准标记法。业务相关者包括创造与梳理流程的业务分析师、负责实施流程的技术开发者、
以及管理和监督流程的经理人。BPMN旨在充当公共语言,跨越业务流程设计和实施之间常见的鸿沟。当前有多种竞争的业务流程建模语言标准供建模过程和工具选用。
广泛采用BPMN将有助于统一基本的业务流程概念的表达(例如:公共或私有的流程、编排),就像一些高级的业务概念一样(例如:例外处理、事务补偿)。
关于BPMN元素的一些介绍可以去看看ronghao大神的blog http://ronghao.iteye.com/category/82912
2.关于BPMN和BPEL:
BPMN2.0开始已经明确了执行语意,所以Fixflow引擎执行BPMN2.0定义的时候并不需要讲BPMN转换成BPEL才能执行,而是直接能够运行在BPMN标准上。
3.读写BPMN文件:
既然说引擎需要支持BPMN2.0标准,那么最先要解决的问题就是BPMN2.0文件格式的读写。
Fixflow读写BPMN2.0文件采用的是EMF框架来完成读写工作。
我们采用的是Eclipse 的开源EMF项目 https://github.com/eclipse/bpmn2 , 其中的org.eclipse.bpmn2项目为EMF读写BPMN2.0的核心项目,
只需要这个项目加上EMF的jar就可以完成读写BPMN2.0文件的工作了。
下面是一个通过EMF加载标准BPMN2.0文件的例子:(下面的例子是将EMF框架从Eclipse插件环境中剥离出来使用)
3.1创建项目
创建一个JavaProject,并创建一个Java类,一个main方法。

3.2 从Github中拉取org.eclipse.bpmn2项目
进入这个地址 https://github.com/eclipse/bpmn2 ,使用git拉取这个项目org.eclipse.bpmn2

由于我们暂时不需要修改这个开源项目的源代码,所以直接将他打成jar就可以了,将生成好的jar添加到EmfBPMN项目的引用中如下图:

下面我们需要添加EMF框架运行所需要的基础jar,所需的jar如下图所示,这些jar都是RCP版本的eclipse中提供的可以去Eclipse 的plugin目录中寻找

依赖jar添加完毕后形成如下结构:

下面是通过EMF框架读取BPMN文件的代码:
package com.fixflow; import java.io.IOException; import org.eclipse.bpmn2.Bpmn2Package;
import org.eclipse.bpmn2.Definitions;
import org.eclipse.bpmn2.di.BpmnDiPackage;
import org.eclipse.bpmn2.util.Bpmn2ResourceFactoryImpl;
import org.eclipse.dd.dc.DcPackage;
import org.eclipse.dd.di.DiPackage;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; public class EmfLoad { private static ResourceSet getResourceSet() {
ResourceSet resourceSet = new ResourceSetImpl();
//注册
(EPackage.Registry.INSTANCE).put("http://www.omg.org/spec/BPMN/20100524/MODEL", Bpmn2Package.eINSTANCE);
(EPackage.Registry.INSTANCE).put("http://www.omg.org/spec/DD/20100524/DI", DiPackage.eINSTANCE);
(EPackage.Registry.INSTANCE).put("http://www.omg.org/spec/DD/20100524/DC", DcPackage.eINSTANCE);
(EPackage.Registry.INSTANCE).put("http://www.omg.org/spec/BPMN/20100524/DI", BpmnDiPackage.eINSTANCE);
Bpmn2ResourceFactoryImpl bpmn2ResourceFactory = new Bpmn2ResourceFactoryImpl();
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("bpmn", bpmn2ResourceFactory);
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("bpmn", bpmn2ResourceFactory);
return resourceSet; } @SuppressWarnings("unused")
public static void main(String[] args) {
ResourceSet resourceSet = getResourceSet();
Resource bpmnResource = null;
//指定资源路径
bpmnResource = resourceSet.createResource(URI.createURI("bpmn/SampleProcess.bpmn")); try {
//加载BPMN文件
bpmnResource.load(null);
} catch (IOException e) {
e.printStackTrace();
}
//获取BPMN文件的根元素
Definitions definitions = (Definitions) bpmnResource.getContents().get(0).eContents().get(0);
} }
我们拷贝一个标准的BPMN2.0文件到bpmn目录下:

下载地址: SampleProcess.bpmn.7z
下面运行这个main方法就能顺利加载标准的BPMN2.0文件了:

写入的方法:只要将修改过后的模型根元素放置到容器中,调用保存方法既可。
resource.getContents().add(definitions);
try {
resource.save(Collections.EMPTY_MAP);
} catch (IOException e) {
e.printStackTrace();
}
上面是对一个标准的BPMN2.0进行读写操作,做为一个实现BPMN2.0引擎来说,
肯定是需要对官方的BPMN元素进行扩展的,以后的章节我们会讲到如果通过EMF读写扩展BPMN2.0元素。
Fixflow引擎解析(二)(模型) - BPMN2.0读写的更多相关文章
- Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素
Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素 Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件 Fixflow引擎解析(二)(模型) - BPMN ...
- Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件
Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素 Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件 Fixflow引擎解析(二)(模型) - BPMN ...
- Fixflow引擎解析(一)(介绍) - Fixflow开源流程引擎介绍
Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素 Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件 Fixflow引擎解析(二)(模型) - BPMN ...
- Fixflow引擎解析(五)(内核) - 基于Token驱动的引擎内核运转原理
Fixflow内核运转图v1.0(beta) 未完待续.........
- 垂直分割群集模型与多通道引擎 -- ESFramework 4.0 进阶(10)
在ESFramework 4.0 进阶(09)-- ESPlatform 支持的三种群集模型一文中,我们介绍了ESPlatform支持的三种群集模型 -- 垂直分割模型.水平分割模型.交叉模型.我们看 ...
- 【原创】流程引擎的网关(遵循BPMN2.0)设计总结
概述 BPMN 2.0是什么呢?业务流程模型注解(Business Process Modeling Notation - BPMN)是 业务流程模型的一种标准图形注解.这个标准 是由对象管理组(Ob ...
- jQuery 2.0.3 源码分析Sizzle引擎解析原理
jQuery 2.0.3 源码分析Sizzle引擎 - 解析原理 声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 先来回答博友的提问: 如何解析 div > p + ...
- Flowable实战(八)BPMN2.0 任务
任务是流程中最重要的组成部分.Flowable提供了多种任务类型,以满足实际需求. 常用任务类型有: 用户任务 Java Service任务 脚本任务 业务规则任务 执行监听器 任务监听器 多 ...
- Smarty模板引擎技术二
Smarty模板引擎技术 内建函数 include_php内建函数 作用:载入一个php文件,将载入的文件的内容赋值给一个变量 注意:该内建函数只能在2.0中使用,如果使用的话,必须得实例化Sma ...
随机推荐
- Using SharePoint 2010 dialogs
转:http://www.techbubbles.com/sharepoint/using-sharepoint-2010-dialogs/ SharePoint 2010 dialogs are J ...
- Android UI -- 的基础知识。
在介绍基础知识之前先明确几个基本的概念 View 视图是所有可视组件的基类,所有的UI控件包括布局类都是从View派生出来的. ViewGroup ViewGroup是View的扩展,可以放置多个Vi ...
- Anti-Grain Geometry 概述
AGG是一个轻量.灵活.可靠的图形算法库,AGG各部分之间是松耦合的,也即是说各部分可以单独使用. The primary goal of Anti-Grain Geometry is to brea ...
- CentOS上安装MyCat-MySQL
1.安装JDK,要求JDK7以上. 2.下载MyCat,地址. 3.解压Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz,到usr/local/ ...
- leetcode@ [241] Different Ways to Add Parentheses (Divide and Conquer)
https://leetcode.com/problems/different-ways-to-add-parentheses/ Given a string of numbers and opera ...
- 【noip2012】疫情控制
题意: 给出一颗n个节点有边权的树 和m个军队所在的位置 军队从某节点移动到相邻节点要花费边长度的时间 求最少要多少时间使得根节点(编号为1)到每个叶子的路径上最少有一支军队(根节点不能有军队) 题解 ...
- HDU-4671 Backup Plan 构造解
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4671 假设是3 m,首先按照第一列按照1 2 3 1 2 3 1...排下去,然后个数就是一个 (m/ ...
- poj1741-Tree(树的分治)
题意:给一棵树,求树上长度小于等于k的链的数量. 题解:http://blog.csdn.net/yang_7_46/article/details/9966455 照着这个博客写的代码. 不到100 ...
- 纯CSS3实现的图片滑块程序,效果非常酷
接下来我们一起来分析一下源码,首先是HTML代码,非常简单: <div id="gal"> <nav class="galnav"> & ...
- Java网络编程(TCP服务端)
/* * TCP服务端: * 1.创建服务端socket服务,并监听一个端口 * 2.服务端为了给客户端提供服务,获取客户端的内容,可以通过accept方法获取连接过来的客户端对象 * 3.可以通过获 ...