实例创建流程_Activiti系列~3.流程定义
流程定义是按照bpmn2.0标准去描述 业务流程,通常使用activiti-explorer(web控制台)或activiti-eclipse-designer插件对业务流程进行建模。
绘制流程,会生成两个文件:.bpmn和.png
IDEA对activiti支持不如eclipse,开发中使用eclipse更有优势。
创建bpmn文件
eclipse在resource目录下创建一个bpmn的目录,然后在此目录中创建一个bpmn文件,创建后显示如下:
从右侧拖一个开始事件后选中该图形后会出现围绕的一系列操作按钮。
流程节点画完后选择每一个节点进行节点属性设置和表单信息。
2 .png图片生成
3.流程定义部署
通过调用 activiti 的 api 将流程定义的 bpmn 和 png 文件添加部署到 activiti 数据库中,可以将文件一个一个进行部署,也可以打包成zip后进行部署。
(1)单个文件部署
//1.创建ProcessEngine对象ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();//2.得到RepositoryService实例RepositoryService repositoryService = processEngine.getRepositoryService(); //3.进行部署Deployment deployment = repositoryService.createDeployment() .addClasspathResource("diagram/holiday.bpmn") //添加bpmn资源 .addClasspathResource("diagram/holiday.png") .name("请假申请单流程") .deploy();//4.输出部署的一些信息 System.out.println(deployment.getName());System.out.println(deployment.getId());
(2)ZIP包方式部署
//1.创建ProcessEngine对象ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();//2.得到RepositoryService实例 RepositoryService repositoryService = processEngine.getRepositoryService();//3.转化出ZipInputStream流对象 InputStream is = ActivitiDeployment .class .getClassLoader() .getResourceAsStream("diagram/holidayBPMN.zip");//将 inputstream流转化为ZipInputStream流ZipInputStream zipInputStream = new ZipInputStream(is);//4.进行部署Deployment deployment = repositoryService.createDeployment() .addZipInputStream(zipInputStream) .name("请假申请单流程") .deploy();//5.输出部署的一些信息System.out.println(deployment.getName());System.out.println(deployment.getId());
执行此操作后activiti会将上边代码中指定的bpm文件和图片文件保存在activiti数据库。
SELECT * FROM act_re_deployment #流程定义部署表,记录流程部署信息
SELECT * FROM act_re_procdef #流程定义表,记录流程定义信息
SELECT * FROM act_ge_bytearray #资源表
如果一次部署多个流程,部署表会有一条记录,对应流程定义表有多条记录。建议:一次部署一个流程,这样部署表和流程定义表是一对一有关系,方便读取流程部署及流程定义信息。
4.流程定义查询
// 流程定义key String processDefinitionKey = "holiday"; // 获取repositoryService RepositoryService repositoryService = processEngine .getRepositoryService(); // 查询流程定义 ProcessDefinitionQuery processDefinitionQuery = repositoryService .createProcessDefinitionQuery(); //遍历查询结果 List list = processDefinitionQuery .processDefinitionKey(processDefinitionKey) .orderByProcessDefinitionVersion() .desc().list();for (ProcessDefinition processDefinition : list) { System.out.println("------------------------"); System.out.println("流程部署id:" + processDefinition.getDeploymentId()); System.out.println("流程定义id:" + processDefinition.getId()); System.out.println("流程定义名称:" + processDefinition.getName()); System.out.println("流程定义key:" + processDefinition.getKey()); System.out.println("流程定义版本:" + processDefinition.getVersion()); }
5.流程定义删除
public void deleteDeployment() { // 流程部署id String deploymentId = "8801"; // 通过流程引擎获取repositoryService RepositoryService repositoryService = processEngine .getRepositoryService(); //普通删除流程定义,如果该流程定义已有流程实例启动则删除时出错 repositoryService.deleteDeployment(deploymentId); //级联删除流程定义:设置true 即使该流程有流程实例启动也可以删除,设置为false非级别删除方式 //repositoryService.deleteDeployment(deploymentId, true); }
6.流程定义资源查询
获取流程定义资源bpmn和png有两种方式:
(1)通过流程定义对象获取
// 流程定义id String processDefinitionId = "8081"; // 获取repositoryService RepositoryService repositoryService = processEngine .getRepositoryService(); // 流程定义对象 ProcessDefinition processDefinition = repositoryService .createProcessDefinitionQuery() .processDefinitionId(processDefinitionId) .singleResult(); //获取bpmn String resource_bpmn = processDefinition.getResourceName(); //获取png String resource_png = processDefinition.getDiagramResourceName(); // 资源信息 System.out.println("bpmn:" + resource_bpmn); System.out.println("png:" + resource_png); File file_png = new File("d:/purchasingflow01.png"); File file_bpmn = new File("d:/purchasingflow01.bpmn"); // 输出bpmn InputStream resourceAsStream = null; resourceAsStream = repositoryService.getResourceAsStream( processDefinition.getDeploymentId(), resource_bpmn); FileOutputStream fileOutputStream = new FileOutputStream(file_bpmn);byte[] b = new byte[1024]; int len = -1; while ((len = resourceAsStream.read(b, 0, 1024)) != -1) { fileOutputStream.write(b, 0, len); } // 输出图片 resourceAsStream = repositoryService.getResourceAsStream( processDefinition.getDeploymentId(), resource_png); fileOutputStream = new FileOutputStream(file_png); while ((len = resourceAsStream.read(b, 0, 1024)) != -1) { fileOutputStream.write(b, 0, len); }
(2)通过查询流程部署信息获取
//流程部署id String deploymentId = "1"; // 通过流程引擎获取repositoryService RepositoryService repositoryService = processEngine .getRepositoryService(); //读取资源名称 List resources = repositoryService .getDeploymentResourceNames(deploymentId); String resource_image = null; //获取图片 for(String resource_name :resources){ if(resource_name.indexOf(".png")>=0){ resource_image = resource_name; } } //图片输入流 InputStream inputStream = repositoryService.getResourceAsStream(deploymentId, resource_image); File exportFile = new File("d:/holiday.png"); FileOutputStream fileOutputStream = new FileOutputStream(exportFile); byte[] buffer = new byte[1024]; int len = -1; //输出图片 while((len = inputStream.read(buffer))!=-1){ fileOutputStream.write(buffer, 0, len); } inputStream.close(); fileOutputStream.close();
7.流程历史信息查询
即使流程定义已经删除了,流程执行的历史信息依然保存在activiti的act_hi_*相关的表中。可以通过HistoryService来查看相关的历史记录。
HistoryService historyService = pe.getHistoryService();HistoricActivityInstanceQuery query = historyService.createHistoricActivityInstanceQuery();query.processInstanceId("1501");Listlist = query.list();for(HistoricActivityInstance ai :list){ System.out.println(ai.getActivityId()); System.out.println(ai.getActivityName()); System.out.println(ai.getProcessDefinitionId()); System.out.println(ai.getProcessInstanceId()); System.out.println("==============================");}
实例创建流程_Activiti系列~3.流程定义相关推荐
- camunda 流程执行追踪_Camunda 流程引擎的一种 Adapter 层实现
上一篇说明了选择 Camunda 的理由.这一篇说明如何实现适配层. 当前还没有专门写一篇对 Camunda 各个功能的详细介绍.如果要获得比较直观的感受,可以下载 Modeler 或者使用在线版的 ...
- PHP写的电视直播插件实例创建流程
PHP写的电视直播插件实例创建流程 这是最近写的一个PHP电视直播插件实例. 作者:G.FLOWER 主页:https://wdc.store 目录结构: 创建zb目录,可放在网站二级目录 创建zby ...
- 基于 Spring Boot 2.x 使用 Activiti 创建一个简易的请假流程
文章目录 1 摘要 2 准备工作 3 请假流程图 3 核心代码 3.1 数据库表 3.2 流程管理工具类 3.3 流程的使用 4 推荐参考资料 5 Github 源码 1 摘要 工作流是需 ...
- 驰骋工作流引擎设计系列04 流程引擎表结构的设计
第1节. 关键字 驰骋工作流引擎 流程快速开发平台 workflow ccflow jflow 第1节. 流程引擎表结构的设计 流程引擎表是流程引擎控制流程运转的数据存储表,是整个流程引擎的核心表.理 ...
- 教程干货——零基础创建简单的在线审批流程
简介:[零起点入门系列教程]将会带给大家从业务视角出发由浅入深地学习用宜搭实现应用搭建.即便是没有任何代码基础的新手只要跟着系列课程,从0开始慢慢修炼,也能找到成功搭建应用的乐趣.今天第三讲,分步教学 ...
- 手动创建线程更好哦_如何通过创建更好的工作流程找到下一个大想法
手动创建线程更好哦 by Kashyap Bhansali 由Kashyap Bhansali 如何通过创建更好的工作流程找到下一个大想法 (How to find your next big ide ...
- Apache DolphinScheduler v2.0.1 Master 和 Worker 执行流程分析系列(三)
点亮 ⭐️ Star · 照亮开源之路 https://github.com/apache/dolphinscheduler 这是一系列关于 DolphinScheduler v2.0.1的源码分析文 ...
- 芯片制造系列全流程:设计、制造、封测
目录 芯片制造系列全流程(简) 一.芯片制造全流程简介 二.芯片设计 三.芯片制造 四.封装测试 芯片目前分为三个主要环节,分别是设计.制程.封测. 设计水平 制造这一块 最后说说封测这一块 芯片设计 ...
- Vue脚手架创建的项目的启动流程
Vue脚手架创建的项目的启动流程 当利用vue脚手架创建项目之后利用 npm run serve 启动开发环境,我们就从这里来开始分析. 入口分析 首先从package.json中的脚本配置来看,np ...
最新文章
- Android项目Build报错Unable to execute dx(65535问题解决方案)
- MATLAB 查看程序执行内存最大使用值
- 【杂谈】菜鸟误入linux会有哪些惨痛的经历
- java token生成和验证_java生成定长度的随机验证码
- asp.net core安全事项(下)
- foobar 添加歌词插件
- 5分钟 0元搭建个人独立博客网站(一)
- 基于JAVA+SpringMVC+MYSQL的社区交友平台
- 如何查找android emulator内核的精确版本
- 亚信安全中标南方电网网络架构优化调整项目 智能联动抑制未知威胁
- 哪些多年前已从iBoxDB内核中移出的功能
- 一个奇怪的发现:html与body,body的margin对html不起作用,html的padding对body却起作用
- Linux内核部件分析 更强的链表klist
- hdu1403(后缀数组模板)
- python切面_Python装饰器与面向切面编程
- pbcmc包的介绍(根据生信技能树Jimmy老师分享的乳腺癌分子分型包资料整理)
- 20200807-玻璃涨停,隔夜低开,纯碱高开,今天晚上就是空头盛宴,43500了哈哈哈,赚钱了,别做了
- Python自学的好方法
- wordpress的excerpt()函数
- 嵌入式开发工程师需要掌握哪些知识呢?
热门文章
- pandas使用nunique函数计算dataframe每个数据列的独特值的个数(count number of unique values in each column of dataframe)
- pandas使用to_datetime函数把dataframe的字符串日期数据列转化为日期格式日期数据列( strings to datetime in dataframe column)
- matplotlib可视化时间序列数据、并高亮时间序列中的指定区域(Highlight a Region of Time-Series Plot with Matplotlib)
- R语言ggplot2可视化绘制带有双y轴(double y axis)的分面图(facet、facet_grid)
- R语言ggplot2可视化将图像标题(title)居中显示实战
- R语言Logistic回归模型亚组分析森林图(forest plot)绘制
- R语言广义线性模型Logistic回归模型列线图分析(nomogram)
- 数据库索引的工作原理及其种类
- python使用openweathermap API获取全世界主要城市天气信息
- R语言apply族函数