进行了流程引擎的构建和初始化之后,接下来要做的就是把写好的流程文档部署到流程引擎中,后续activiti.cfg.xml的配置如果没有特指的话,一般就用第一章提供的例子。

首先画一个bpmn的图,可以通过集成开发环境的插件,也可以直接写xml形式。本系列中我都是使用eclipse的Activiti Diagram Editor插件。这里先写一个xml形式的bpmn图firstBPM.bpmn:

<?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="http://www.activiti.org/test"><process id="firstBpmProcess" name="My process" isExecutable="true"><startEvent id="startevent1" name="Start"></startEvent><userTask id="usertask1" name="myTask1" activiti:assignee="sadoshi"></userTask><endEvent id="endevent1" name="End"></endEvent><sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow><sequenceFlow id="flow2" sourceRef="usertask1" targetRef="endevent1"></sequenceFlow></process><bpmndi:BPMNDiagram id="BPMNDiagram_myProcess"><bpmndi:BPMNPlane bpmnElement="myProcess" id="BPMNPlane_myProcess"><bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1"><omgdc:Bounds height="41.0" width="35.0" x="505.0" y="40.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1"><omgdc:Bounds height="55.0" width="105.0" x="470.0" y="150.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1"><omgdc:Bounds height="35.0" width="35.0" x="505.0" y="240.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1"><omgdi:waypoint x="522.0" y="81.0"></omgdi:waypoint><omgdi:waypoint x="522.0" y="150.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2"><omgdi:waypoint x="522.0" y="205.0"></omgdi:waypoint><omgdi:waypoint x="522.0" y="240.0"></omgdi:waypoint></bpmndi:BPMNEdge></bpmndi:BPMNPlane></bpmndi:BPMNDiagram>
</definitions>

大概是这样的一张流程图,一个开始节点,一个userTask节点,一个结束节点:

接着对这张流程图进行部署。部署的方法有文本方式、classpath方式、inputStream方式和zipInputStream方式。classpath的话要求bpmn文档在工程的classpath下,而其他几种方式则可以选择物理路径,比较灵活。另外zipInputStream适用于部署多张流程图打包而成的zip文件。这里展示使用inputStream方式的:

package engineDeploy;import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.EndEvent;
import org.activiti.bpmn.model.Process;
import org.activiti.bpmn.model.SequenceFlow;
import org.activiti.bpmn.model.StartEvent;
import org.activiti.bpmn.model.UserTask;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.DeploymentBuilder;public class App {private ProcessEngine pe;public void getFromProcessEngineConfiguration() {ProcessEngineConfiguration pec = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");pe = pec.buildProcessEngine();}public void deploy() {RepositoryService repositoryService = pe.getRepositoryService();DeploymentBuilder deploymentBuilder = repositoryService.createDeployment();InputStream inputStream = null;try {inputStream = App.class.getClassLoader().getResource("bpmn/firstBPM.bpmn").openStream();deploymentBuilder.addInputStream("first.bpmn", inputStream);deploymentBuilder.name("firstDeployment");deploymentBuilder.deploy();} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) {App app = new App();app.getFromProcessEngineConfiguration();app.deploy();}
}

注意,如果添加的资源是bpmn流程的话,第35行addInputStream的第一个参数,后缀名必须是bpmn或bpmn20.xml,否则流程引擎不会对其进行解析,部署之后不会生成流程实例,就无法进行流程的启动等操作。

部署之后,查看数据库,act_re_deployent表有我们刚才部署的流程

在act_ge_bytearray表上也有流程对应的资源,一般是bpmn图

在act_re_procdef表上应该会生成bpmn流程文档中process对应的流程定义:

这样流程就算完成部署了。

可以分析一下刚才App类中,deploy函数内的代码。activiti的部署由RepositoryService负责,而RepositoryService则委托DeploymentBuilder进行部署。这里使用了建造者模式。通过源码分析可知DeploymentBuilder为流程部署的实体DeploymentEntity进行属性设置,然后再调用deploy进行部署。部署了流程之后,下一章会介绍流程的启动。

扩展:

其实流程部署并不是一定需要通过bpmn文件。因为activiti会把bpmn文件中的元素转化到BpmnModel中。activiti还提供了一种编程式的方式去部署bpmn流程,就是用户可以新建一个BpmnModel,然后设置好流程中的元素,把BpmnModel部署到流程引擎中:

public void addBpmnModel() {SequenceFlow flow1 = new SequenceFlow();flow1.setId("flow1");flow1.setName("start->userTask1");flow1.setSourceRef("startEvent1");flow1.setTargetRef("userTask1");SequenceFlow flow2 = new SequenceFlow();flow2.setId("flow2");flow2.setName("userTask1->end");flow2.setSourceRef("userTask1");flow2.setTargetRef("endEvent1");BpmnModel bpmnModel = new BpmnModel();Process process = new Process();process.setId("secondBpmProcess");StartEvent startEvent = new StartEvent();startEvent.setId("startEvent1");startEvent.setOutgoingFlows(Arrays.asList(flow1));UserTask userTask1 = new UserTask();userTask1.setId("userTask1");userTask1.setName("userTask1");userTask1.setIncomingFlows(Arrays.asList(flow1));userTask1.setOutgoingFlows(Arrays.asList(flow2));EndEvent endEvent = new EndEvent();endEvent.setId("endEvent1");endEvent.setName("endEvent1");endEvent.setIncomingFlows(Arrays.asList(flow2));process.addFlowElement(startEvent);process.addFlowElement(flow1);process.addFlowElement(userTask1);process.addFlowElement(flow2);process.addFlowElement(endEvent);bpmnModel.addProcess(process);RepositoryService repositoryService = pe.getRepositoryService();DeploymentBuilder deploymentBuilder = repositoryService.createDeployment();deploymentBuilder.addBpmnModel("second", bpmnModel);deploymentBuilder.deploy();
}

这个部署的流程和上面的大致相同。可以查看act_re_deployent和act_ge_bytearray的效果,和之前的inputStream方式类似。

activiti学习(二)——activiti流程的部署相关推荐

  1. Activiti学习——生成历史流程跟踪图

    需求说明 流程在流转或者结束后,可以查看其流转历史流程图 效果图 实现思路 获取流程图 获取指定流程的流转环节 获取每个流转环节之间的线 根据流程图,环节,线绘制流转历史流程图 实现代码 @Contr ...

  2. SpringBoot 整合Activiti(二)——流程审批完整示例

    前两天做了一个SpringBoot整合Activiti的完整示例,功能包括:退回/通过(节点条件).指定办理人.生成流程图.高亮显示已办节点.查询任务列表(办理人)等,下面先简单记录(含完整代码),十 ...

  3. ballerina 学习二十七 项目k8s部署 运行

    ballerina k8s 部署和docker 都是同样的简单,编写service 添加注解就可以了 参考项目 https://ballerina.io/learn/by-guide/restful- ...

  4. CCP学习二——通信流程

    1 概述   CCP通信按信息传输方式分为:POLLING(问答)和DAQ方式   按功能模式分为三种:SESSION(会话).CAL(标定).DAQ(查询)   工作流程一般为,程序初始化完成后,通 ...

  5. activiti工作流学习(二)

    流程连线 流程开始→某个学生请假(一般情况/特殊情况)→班长审批通过→(进行判断,如果是一般情况直接结束;如果是特殊情况流程指向教师审批,教师审批结束后)→结束 任务设定 学生请假,执行人设置为 ${ ...

  6. activiti学习(二十一)——流程虚拟机源码分析(三)——从进入到离开userTask

    前言 承接上文<activiti学习(二十)--流程虚拟机源码分析(二)--从开始节点离开到下个节点前>,假设execution接下来进入的节点是userTask,本文分析一下进入user ...

  7. 学习笔记之-Activiti7工作流引擎,概述,环境搭建,类关系图,使用Activiti BPMN visualizer,流程变量,组任务 网关,Activiti整合Spring SpringBoot

    本篇学习笔记是观看黑马程序员Activiti7视频而得 Activiti7 一.工作流介绍 1.1 概念 工作流(Workflow),就是通过计算机对业务流程自动化执行管理.它主要解决的是" ...

  8. Activiti学习(4)简单的请假流程

    在前一篇文章的基础上,编写一个稍微复杂的请假流程,进一步熟悉Activiti的基本知识,并期望能够触类旁通,解决上一篇博文中没有解决的问题.实现过程中,参考了以下文章,在此向作者表示感谢. 1.act ...

  9. JAVAWEB开发之工作流详解(二)——Activiti核心API的使用(流程定义和流程实例的管理、流程变量、监听器...)以及与Spring的集成

    管理流程定义 设计流程定义文档 bpmn文件 设置方式可以直接使用插件图形化界面进行设置 为某任务节点指定任务执行者 保存后的BPMN文件可以使用XML编辑器打开 BPMN 2.0根节点是defini ...

  10. Activiti学习(二)数据表结构

    Activiti工作流引擎数据库表结构 数据库表的命名 Acitiviti数据库中表的命名都是以ACT_开头的.第二部分是一个两个字符用例表的标识.此用例大体与服务API是匹配的. l        ...

最新文章

  1. restful url 设计规范_restFul接口设计规范
  2. C语言中的union
  3. 收藏长文|Java 代码精简之道
  4. Java集合HashSet
  5. Visual C++——修改框体背景颜色
  6. 停车管理系统汽车到达汽车离去c语言,停车场管理系统 C语言实现
  7. labview求n阶乘的和_递归算法(从阶乘、斐波那契到汉诺塔的递归图解)
  8. matlab 高斯迭代代码_用Matlab编写你的第一个有限元_《数值计算与程序设计》系列课程...
  9. visual studio toolbox 修复
  10. 【渝粤教育】国家开放大学2019年春季 2080现代教育思想 参考试题
  11. 源码解析Servlet和HttpServlet
  12. 前端开发_开发软件Hbuilder简介
  13. c1语言实验报告怎么写,c语言程序设计实验报告模板
  14. 计算机主机的税收,税控电脑
  15. 手机网速正常电脑很慢_路由器WiFi速度正常,但电脑和手机上网速度慢怎么办?...
  16. IBM Cloud Satellite在Tencent Cloud上的部署--Part1准备
  17. DPDK应用示例指南简介(汇总)
  18. SMILES, a Chemical Language and Information System.【SMILES, 一种化学语言和信息系统。】
  19. 必读 | 一文看尽2019-2020各大顶会GNN论文(附链接)
  20. mac下使用python3_mac 下使用python3运行ride

热门文章

  1. [转载]Merlin 给 Java 平台带来了非阻塞 I/O
  2. 第11章 The Extended Kalman Filter
  3. 给力回馈!亲~时间有限哦!
  4. mysql show tables报错_show tables能看到表却无法读写?
  5. (java)leetcode122 买卖股票的最佳时机2 数组的多个谷底与峰值的求和
  6. (java)leetcode121 买卖股票的最佳时机1(Best Time to Buy and Sell Stock)针对数组的峰值和谷底的操作
  7. 无线模块在分布式数据采集中的应用
  8. cdma2000解析_CDMA2000 1x EV-DO技术解析
  9. python3.7安装numpy库和matplotlib库_详解Python中的Numpy、SciPy、MatPlotLib安装与配置
  10. sparql查询mysql_SPARQL查询以检索所有对象和属性