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读写的更多相关文章

  1. Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素

    Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素 Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件 Fixflow引擎解析(二)(模型) - BPMN ...

  2. Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件

    Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素 Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件 Fixflow引擎解析(二)(模型) - BPMN ...

  3. Fixflow引擎解析(一)(介绍) - Fixflow开源流程引擎介绍

    Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素 Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件 Fixflow引擎解析(二)(模型) - BPMN ...

  4. Fixflow引擎解析(五)(内核) - 基于Token驱动的引擎内核运转原理

    Fixflow内核运转图v1.0(beta) 未完待续.........

  5. 垂直分割群集模型与多通道引擎 -- ESFramework 4.0 进阶(10)

    在ESFramework 4.0 进阶(09)-- ESPlatform 支持的三种群集模型一文中,我们介绍了ESPlatform支持的三种群集模型 -- 垂直分割模型.水平分割模型.交叉模型.我们看 ...

  6. 【原创】流程引擎的网关(遵循BPMN2.0)设计总结

    概述 BPMN 2.0是什么呢?业务流程模型注解(Business Process Modeling Notation - BPMN)是 业务流程模型的一种标准图形注解.这个标准 是由对象管理组(Ob ...

  7. jQuery 2.0.3 源码分析Sizzle引擎解析原理

    jQuery 2.0.3 源码分析Sizzle引擎 - 解析原理 声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 先来回答博友的提问: 如何解析 div > p + ...

  8. Flowable实战(八)BPMN2.0 任务

      任务是流程中最重要的组成部分.Flowable提供了多种任务类型,以满足实际需求.   常用任务类型有: 用户任务 Java Service任务 脚本任务 业务规则任务 执行监听器 任务监听器 多 ...

  9. Smarty模板引擎技术二

    Smarty模板引擎技术 内建函数 include_php内建函数 作用:载入一个php文件,将载入的文件的内容赋值给一个变量   注意:该内建函数只能在2.0中使用,如果使用的话,必须得实例化Sma ...

随机推荐

  1. u-boot向linux内核传递启动参数(详细)

    U-BOOT 在启动内核时,会向内核传递一些参数.BootLoader 可以通过两种方法传递参数给内核,一种是旧的参数结构方式(parameter_struct),主要是 2.6 之前的内核使用的方式 ...

  2. Apache-AB压力测试实例

    一 AB背景介绍 Apache附带的压力测试工具apache bench--简称ab,非常容易使用,并且完全可以摸你各种条件对Web服务器发起测试请求.ab可以直接在Web服务器本地发起测试请求,这对 ...

  3. FZU 2105-Digits Count(线段树延时标记)

    题意: 每次操作区间每个数进行一种(&或|.或^ )给定的一个数,到sum时统计给定区间的和. 分析: 这个题让我觉得我的思维很不活跃,对懒惰标记理解,还远远不够,通过这道题我对懒惰标记加深了 ...

  4. 设计模式_State_状态模式

    形象例子: 跟MM交往时,一定要注意她的状态哦,在不同的状态时她的行为会有不同,比如你约她今天晚上去看电影,对你没兴趣的MM就会说“有事情啦”,对你不讨厌但还没喜欢上的MM就会说“好啊,不过可以带上我 ...

  5. python 网络编程 (二)---异常

    异常 python的socket模块实际上定义了4种可能出现的异常: 1)与一般I/O 和通信问题有关的socket.error; 2)与查询地址信息有关的socket.gaierror; 3)与其他 ...

  6. HDU-4694 Professor Tian 概率DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4649 题意:给一个位运算的表达式,每个运算符和其后的运算数有一定概率不计算,求最后表达式的期望. 因为 ...

  7. [Objective-c 基础 - 2.9] 类的本质

    A.概念 类对象:类也是一个对象,是Class类型的对象 实例对象:创建的对象,有一个isa指针指向类   B.操作 获取内存中的内对象 1. 使用实例对象获取 Class c = [p class] ...

  8. 转载ASP.net 中 OutputCache 指令各个参数的作用

    使用@ OutputCache指令 使用@ OutputCache指令,能够实现对页面输出缓存的一般性需要.@ OutputCache指令在ASP.NET页或者页中包含的用户控件的头部声明.这种方式非 ...

  9. php 接收 Content-Type 是 application/json的请求数据

    工作中为其他公司编写了一个提供请求的接口,自己调试的时候是用form提交的,所以可以用$_POST取键接收方式,而对接联调的时候发现总是取不到数据,把$_POST整个序列化放入日志也是[] ,空的,于 ...

  10. angular的filter

    angular的filter filter两种用法 1.在模板中使用filter {{expression|filter}}//基本用法 {{expression|filter1|filter2|fi ...