Activiti 流程部署方式 activi 动态部署(高级源代码篇)

Activiti的流程 部署方式有非常多种方式,我们能够依据activit工作流引擎提供的ap方式进行部署。

当然了实际需求决定你要使用哪一种api操作,后面的总结具体介绍了使用场景。

以下看一下部署方式。

流程部署的方式在类org.activiti.engine.repository.DeploymentBuilder中定义的部署方接口式例如以下

DeploymentBuilder addInputStream(String resourceName, InputStream inputStream);
  DeploymentBuilder addClasspathResource(String resource);
  DeploymentBuilder addString(String resourceName, String text);
  DeploymentBuilder addZipInputStream(ZipInputStream zipInputStream);
  DeploymentBuilder addBpmnModel(String resourceName, BpmnModel bpmnModel);

能够看出activit工作流引擎一共提供五种方式进行流程对的部署。

addInputStream 依据流进行部署。

addClasspathResource 依据resource部署。

addString依据字符串部署。

addZipInputStream依据zip流进行部署。

addBpmnModel 依据BpmnModel进行部署。

这样的方式使用的场景就是我们自己设计一个流程设计器画布。自己去解析成bpmn规范文件。适合动态的拓展。自己定义。

以下一一解说怎样使用api去进行部署。

1.1.1. addInputStream方式

流程定义例如以下所看到的:

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="daling">
  <process id="daling" name="name_daling" isExecutable="true" activiti:candidateStarterUsers="a,b,c,d">
    <startEvent id="startevent1" name="Start"></startEvent>
    <userTask id="usertask1" name="usertask1审批" activiti:candidateGroups="1,2"></userTask>
    <userTask id="usertask2" name="usertask2审批" activiti:candidateUsers="b,c"></userTask>
    <endEvent id="endevent1" name="End"></endEvent>
    <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
    <sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
    <sequenceFlow id="flow3" sourceRef="usertask2" targetRef="endevent1"></sequenceFlow>
  </process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_daling">
    <bpmndi:BPMNPlane bpmnElement="daling" id="BPMNPlane_daling">
      <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
        <omgdc:Bounds height="35.0" width="35.0" x="230.0" y="10.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
        <omgdc:Bounds height="55.0" width="105.0" x="300.0" y="110.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2">
        <omgdc:Bounds height="55.0" width="105.0" x="280.0" y="192.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
        <omgdc:Bounds height="35.0" width="35.0" x="230.0" y="340.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
        <omgdi:waypoint x="247.0" y="45.0"></omgdi:waypoint>
        <omgdi:waypoint x="352.0" y="110.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
        <omgdi:waypoint x="352.0" y="165.0"></omgdi:waypoint>
        <omgdi:waypoint x="332.0" y="192.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
        <omgdi:waypoint x="332.0" y="247.0"></omgdi:waypoint>
        <omgdi:waypoint x="247.0" y="340.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>

程序代码例如以下所看到的:

InputStream inputStream=ProcessEnginesDemo.class.getClassLoader().getResourceAsStream("demo1.bpmn");
 Deployment deploy = repositoryService2.createDeployment().addInputStream("addInputStream", inputStream).deploy();
System.out.println(deploy);

程序的执行结果例如以下所看到的:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

1.1.2. addClasspathResource方式

流程的定义还是第一种方式的流程图,程序例如以下所看到的:

Deployment
deploy2 =repositoryService2.createDeployment().addClasspathResource("demo1.bpmn").deploy();

addClasspathResource中的參数是依据classpath方式载入,假设demo1.bpmn路径在com.daling.ch1.ProcessEnginesDemo包以下则參数參入com/daling/ch1/ProcessEnginesDemo/demo1.bpmn

程序的执行例如以下图所看到的:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

1.1.3. addString方式

流程的定义还是第一种方式的流程图,程序例如以下所看到的:

String str=read("D:\\WorkSpace\\activitidemo\\src\\main\\resources/demo1.bpmn");
Deployment deploy2 = repositoryService2.createDeployment().addString("string", str).deploy();
public static String read(String filePath) {
// 读取txt内容为字符串
StringBuffer txtContent = new StringBuffer();
// 每次读取的byte数
byte[] b = new byte[8 * 1024];
InputStream in = null;
try {
// 文件输入流
in = new FileInputStream(filePath);
while (in.read(b) != -1) {
// 字符串拼接
txtContent.append(new String(b));
}
// 关闭流
in.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return txtContent.toString();
}

程序的执行效果例如以下图所看到的:

1.1.4. addZipInputStream方式

流程的定义还是第一种方式的流程图。仅仅只是讲demo1.bpmn打包成zip文件,结构例如以下:

 

 

程序操作例如以下所看到的:

InputStream
inputStream=ProcessEnginesDemo.class.getClassLoader().getResourceAsStream("demo1.zip");

ZipInputStream
zipInputStream=new ZipInputStream(inputStream);

Deployment
deploy2 =repositoryService2.createDeployment().addZipInputStream(zipInputStream).deploy();

程序的输出结果例如以下图所看到的:

1.1.5. addBpmnModel方式

这一种方式比較复杂须要自己去手动拼接对象,这里我们就写一个简单的吧。实际开发中假设不够用能够自己扩展依据这个demo详细的实现方式例如以下:

ProcessEnginesDemo demo = new ProcessEnginesDemo();
RepositoryService repositoryService2 = demo.getRepositoryService();
BpmnModel bpmnModel=new BpmnModel();
StartEvent startEvent=new StartEvent();
startEvent.setId("start1shareniu");
startEvent.setName("start1shareniu");
UserTask userTask=new UserTask();
userTask.setId("userTask1shareniu");
userTask.setName("userTask1shareniu");
EndEvent endEvent=new EndEvent();
endEvent.setId("endEventshareniu");
endEvent.setName("endEventshareniu");
List<SequenceFlow> sequenceFlows=new ArrayList<SequenceFlow>();
List<SequenceFlow> toEnd=new ArrayList<SequenceFlow>();
SequenceFlow s1=new SequenceFlow();
s1.setId("starttouserTask");
s1.setName("starttouserTask");
s1.setSourceRef("start1shareniu");
s1.setTargetRef("userTask1shareniu");
sequenceFlows.add(s1);
SequenceFlow s2=new SequenceFlow();
s2.setId("userTasktoend");
s2.setName("userTasktoend");
s2.setSourceRef("userTask1shareniu");
s2.setTargetRef("endEventshareniu");
toEnd.add(s2);
startEvent.setOutgoingFlows(sequenceFlows);
userTask.setOutgoingFlows(toEnd);
userTask.setIncomingFlows(sequenceFlows);
endEvent.setIncomingFlows(toEnd);
Process process=new Process();
process.setId("process1");
process.addFlowElement(startEvent);
process.addFlowElement(s1);
process.addFlowElement(userTask);
process.addFlowElement(s2);
process.addFlowElement(endEvent);
bpmnModel.addProcess(process);
repositoryService2.createDeployment().addBpmnModel("bpmnModel", bpmnModel).deploy();

程序的输出截下图所看到的:

总结:

五种方式的总结:

1.假设须要自己开发一套流程设计的话就使用addBpmnModel这样的方法吧。这样的方式更加灵活。缺点就是须要了解每个对象的含义,须要对bpmnMode对象中的各个子对象都有所了解。

2.假设项目中的流程图是固定的可是一些候选组或者人或者名称不是固定的。须要从数据库中查询出来赋值在部署使用addString这样的方法,配合velocity等叶面静态化工具一起使用。

3.假设须要用户自己上传文件部署的话,能够使用addInputStream和addZipInputStream这两种方式。

时间: 2024-11-08 08:35:40

Activiti 流程部署方式 activi 动态部署(高级源代码篇)的相关文章

Activiti 流程部署方式 activi 动态部署(高级源码篇)

欢迎加入我们的学习提升群523988350,里面有京东.美团网的技术人员,可以相互交流 Activiti的流程 部署方式有很多种方式,我们可以根据activit工作流引擎提供的ap方式进行部署. 当然了实际需求决定你要使用哪一种api操作,后面的总结详细介绍了使用场景. 下面看一下部署方式. 流程部署的方式在类org.activiti.engine.repository.DeploymentBuilder中定义的部署方接口式如下 : DeploymentBuilder addInputStrea

ThinkPHP 学习之项目部署:应用部署方式与模块分组部署方式

/** * ThinkPHP version 3.1.3 */ ThinkPHP ( 官方网站:http://www.thinkphp.cn/ ) 目前最新版本是 3.2.2,它要求 PHP 的版本高于 5.3.0,由于我的 WAMPServer 集成的 PHP 版本是 5.2.6,所以下载了低一版本的 ThinkPHP ( 3.1.3 ) 来学习. 下载的 ThinkPHP 的框架包解压后的结构是: ├─ThinkPHP.php 框架入口文件 ├─Common 框架公共文件 ├─Conf 框架

秒开缓存服务器部署方式

秒开缓存系统三种部署方式: 镜像部署方式: 旁路部署方式: 桥接部署方式:

NBIoT三种部署方式【转】

转自:https://472880.kuaizhan.com/89/34/p441944286fccf2 本文作者:吴老司撩通信 本文来源:EETOP NB-IoT支持在频段内(In-Band).保护频段(Guard Band)以及独立(Stand-alone)共三种部署方式. 本篇介绍NB的三种部署方式(Operation Modes). 那个谁,你到底叫啥名 关于Operation Modes的翻译问题,列举下:工作模式.工作方式.操作模式.部署方式.部署场景.运行模式……这是非要凑成七个葫

增量部署和全量部署

应用部署是工程人员(包括开发.测试和运维)每日面对的重要问题之一.尤其是在应用交付频率越来越高的当下,工程人员经常需要花费巨大的成本和心血来完成频繁的应用部署工作.在过去半年里面,我们接触了大量的企业客户,他们来自不同的行业,有着不同的规模,但我们发现他们在应用部署上面都有一个类似的困惑,即是应该选择增量部署还是全量部署.这里,我们希望展开阐述一下我们的观点.在开始讨论这个问题前,让我们首先重新明确两个问题. 部署(deployment)还是发布(release)?部署一般指把应用或者服务"安装

Tomcat项目静态和动态部署方式

Tomcat项目部署方式 一.静态部署 1.直接将web项目文件件拷贝到webapps 目录中   Tomcat的Webapps目录是Tomcat默认的应用目录,当服务器启动时,会加载所有这个目录下的应用.   所以可以将JSP程序打包成一个 war包放在目录下,服务器会自动解开这个war包,   并在这个目录下生成一个同名的文件夹.一个war包就是有特性格式的jar包,   它是将一个web程序的所有内容进行压缩得到.具体如何打包,可以使用许多开发工具的IDE环境,如Eclipse等.   也

flowable流程资源部署方式

一. 用flowable Modeler设计好流程图后,有多种资源部署方式 导出xml,然后部署到flowable数据库中 public Deployment deployFlow(String filePath) { try { DeploymentBuilder deploymentBuilder = repositoryService.createDeployment() .addClasspathResource(filePath); Deployment deployment = de

Apache Spark源码走读之7 -- Standalone部署方式分析

欢迎转载,转载请注明出处,徽沪一郎. 楔子 在Spark源码走读系列之2中曾经提到Spark能以Standalone的方式来运行cluster,但没有对Application的提交与具体运行流程做详细的分析,本文就这些问题做一个比较详细的分析,并且对在standalone模式下如何实现HA进行讲解. 没有HA的Standalone运行模式 先从比较简单的说起,所谓的没有ha是指master节点没有ha. 组成cluster的两大元素即Master和Worker.slave worker可以有1到

Android动态部署五:如何从插件apk中启动Service

转载请注明出处:http://blog.csdn.net/ximsfei/article/details/51072332 github地址:https://github.com/ximsfei/DynamicDeploymentApk Android动态部署一:Google原生Split APK浅析 Android动态部署二:APK安装及AndroidManifest.xml解析流程分析 Android动态部署三:如何从插件apk中启动Activity(一) Android动态部署四:如何从插