zoukankan      html  css  js  c++  java
  • Fixflow引擎解析(二)(模型)

    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文件了:

    写入的方法:只要将修改过后的模型根元素放置到容器中,调用保存方法既可。

    1 resource.getContents().add(definitions);
    2 
    3 try {
    4      resource.save(Collections.EMPTY_MAP);
    5   } catch (IOException e) {
    6        e.printStackTrace();
    7   }

      

    上面是对一个标准的BPMN2.0进行读写操作,做为一个实现BPMN2.0引擎来说,

    肯定是需要对官方的BPMN元素进行扩展的,以后的章节我们会讲到如果通过EMF读写扩展BPMN2.0元素。

  • 相关阅读:
    (2)javascript的基本语法、数据结构、变量
    (1)认识javascript
    CSS 浅析position:relative/absolute定位方式
    jquery实现下拉框多选
    Vue.js not detected
    手机代理调试Charles Proxy和Fiddler
    render函数之jsx应用
    vue组件通信方式(多种方案)
    点击页面空白处地方,隐藏弹窗
    css圆角不圆和1px方案
  • 原文地址:https://www.cnblogs.com/kenshin1985/p/3531485.html
Copyright © 2011-2022 走看看