activiti学习6:启动流程后动态获取流程图
activiti学习6:启动流程后动态获取流程图
上一篇博客中介绍了activiti如何开启流程和让流程前进,这次来学习下如何动态的获取activiti的流程图
本文中使用的activiti版本是5.22.0
一、绘图原理
activiti中提供了一个可以用来绘制流程图的类DefaultProcessDiagramGenerator
,这个类在5.22.0及以上的版本中
是以一个单独jar包的方式提供的,所以还需要引入相应的依赖。
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-image-generator</artifactId>
<version>5.22.0</version>
</dependency>
使用时先创建这个类的对象,
//这个类在5.22.0往上的版本中才有
DefaultProcessDiagramGenerator diagramGenerator=new DefaultProcessDiagramGenerator();
然后调用画图方法
diagramGenerator.generateDiagram(bpmnModel, imageType, highLightedActivities);
其中的几个参数:
bpmnModel:当前流程对应的流程模型,可以通过repositoryService.getBpmnModel(processDefinitionId)获取
imageType:图片类型,jpg,png等
highLightedActivities:需要高亮显示的节点的id
二、根据流程定义id绘图
根据流程定义表act_re_procdef的主键id绘图,这时可以没有流程,只要流程图成功部署了就会产生act_re_procdef表的记录。所以也就不存在节点高亮的问题,因为这个图和流程实例无关。
@Test
public void test1() throws Exception {
//根据流程定义id来获取BpmnModel对象
String processDefinitionId="process:2:4304";
BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId);
//这个类在5.22.0往上的版本中才有
DefaultProcessDiagramGenerator diagramGenerator=new DefaultProcessDiagramGenerator();
//绘制bpmnModel代表的流程的流程图
InputStream inputStream = diagramGenerator.generateDiagram(bpmnModel, "png", new ArrayList<String>());
FileOutputStream output=new FileOutputStream(new File("d:/test.png"));
IOUtils.copy(inputStream, output);
System.out.println("输出完成");
}
注意这里generateDiagram()方法的第3个参数传了一个空list,这个list表示要高亮显示的节点的id集合。也就是流程图中每一个任务的id
三、根据流程实例id绘图
3.1 基本原理
上面已经实现了根据processDefinitionId画图。根据processInstanceId画图时,其实是先根据processInstanceId查询到对应的流程实例对象ProcessInstance
,
然后通过流程实例对象获取到processDefinitionId,使用其中的get方法processInstance.getProcessDefinitionId()
再想办法获取到需要高亮显示的节点的id:当前节点+走过的节点。
3.2 当前节点的获取
使用runtimeService服务组件的方法来获取
String executionId=processInstance.getId();
List<String> activeActivityIds = runtimeService.getActiveActivityIds(executionId);
activeActivityIds这个list就是当前节点的id集合,如果是并行流程会有多个,其他情况只有一个。
3.3 走过的节点的获取
走过的节点需要从activiti的历史行为表act_hi_actinst中获取。流程的行为数据记录在该表中,当流程进行到一个节点时,该表中会记录流程节点的信息,包括节点id,名称等。其中有一个ACT_ID_
就代表流程图上对应节点的id
也就是需要高亮显示的节点id
所以我们要做的就是从这张表中查询到这个数据。activiti已经提供了查询这张表的api,可以通过historyService这个服务组件来获取
//得到已经走过的节点的id集合
HistoricActivityInstanceQuery historicActivityInstanceQuery = historyService.createHistoricActivityInstanceQuery();
List<HistoricActivityInstance> historicActivityInstanceList = historicActivityInstanceQuery.processInstanceId(processInstanceId).list();
for(HistoricActivityInstance hi:historicActivityInstanceList) {
String taskKey=hi.getActivityId();
activeActivityIds.add(taskKey);
}
以上代码先查询出ACT_ID_
,再把它们添加到需要高亮显示的集合activeActivityIds中
3.4 绘图
DefaultProcessDiagramGenerator defaultProcessDiagramGenerator=new DefaultProcessDiagramGenerator();
//获取流程图的输入流
InputStream inputStream = defaultProcessDiagramGenerator.generateDiagram(bpmnModel, "png", activeActivityIds);
//输出图片到指定路径
IOUtils.copy(inputStream, new FileOutputStream(new File("d:/test2.png")));
System.out.println("输出成功");
这样绘制出的流程图上已经走过的节点就会被高亮显示。
四、总结
绘制流程图的原理是使用DefaultProcessDiagramGenerator类中的方法
这个类在一个单独的jar中提供,需要新添加依赖
要高亮显示某些节点,就给画图方法中传入节点id的集合。
activiti学习6:启动流程后动态获取流程图的更多相关文章
- activiti学习5:开启流程和流程前进
目录 activiti学习5:开启流程和流程前进 一.流程和任务的关系 二.开启流程 2.1根据流程定义key开启流程 三.查询用户任务 3.1 TaskQuery 四.完成任务 activiti学习 ...
- Activiti 5.18启动流程到完成所有任务之间的数据库变化(转)
来写一下Activiti 5.18版本从启动流程到整个流程结束之间数据库表的变化 先给出流程图,很简单的流程,就是两个UserTask: 代码如下: DeploymentBuilder builder ...
- Activiti学习笔记4 — 流程实例化
1.创建流程引擎对象 private ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); 2.启动流程 流程 ...
- activity通过流程实例id动态获取流程图并展示在jsp页面上
提供的Service方法如下: Java /** * 获取当前任务流程图 * * @param processInstanceId * @return */ @Override public Inpu ...
- RTT学习之启动流程
总结RT-Thread的启动流程. 非运行时与运行时的image文件分别是什么样的,请画下来.是谁将 RW 段中的 RW-data(初始化的全局变量)搬运到 RAM 中? MDK环境下各种数据段存储 ...
- 反射学习2-通过反射机制动态获取属性的值模拟Struts的自动赋值
一.准备知识: Java反射机制 处理事务的JavaBean String的操作常用方法 二.模拟步骤 这里我们通过反射机制动态获取属性的值模拟Struts中的自动赋值. 1.首先创建 ...
- CentOS6启动流程(含详细流程图)
参考:Linux启动流程和grub详解(作者:好笔记运维) 为什么把这位的参考放在前面,主要是这位大佬的流程图太详细了.虽说不一定要了解这么详细,但还是很佩服啊.不多说,上图(在新标签中打开图片) 下 ...
- Activiti学习笔记3 — 流程定义
一.创建流程引擎对象 private ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); 二.发布一个流程 ...
- java框架之SpringBoot(10)-启动流程及自定义starter
启动流程 直接从 SpringBoot 程序入口的 run 方法看起: public static ConfigurableApplicationContext run(Object source, ...
随机推荐
- 阿里巴巴Java开发手册(命名规范/常量定义篇)——查自己的漏-补自己的缺
一.编程规约 (一) 命名规约 1. [强制]所有编程相关命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束. 反例: _name / __name / $Object / name_ / ...
- SDOI2019快速查询
链接 vijos 思路 虽然询问1e7,但他询问很有意思,所以最多修改1e5个. 先把他们修改的点缩小到1e5之内并没有什么影响. 然后维护mul和add.不修改很好弄,修改的点可以弄点式子加加减减弄 ...
- 第4组 Alpha冲刺(1/4)
队名:斗地组 组长博客:地址 作业博客:Alpha冲刺(1/4) 各组员情况 林涛(组长) 过去两天完成了哪些任务: 1.安排好各个组员的任务 2.收集各个组员的进度 3.写页面 4.写博客 展示Gi ...
- 【ARC098F】Donation
[ARC098F]Donation 题面 atcoder 题意: 给定一张\(n\)个点,\(m\)条边的无向图.这张图的每个点有两个权值 \(a_i,b_i\). 你将会从这张图中选出一个点作为起点 ...
- 在 Ubuntu/Debian 下安装 PHP7.3 教程
介绍 最近的 PHP 7.3.0 已经在 2018 年12月6日 发布 GA,大家已经可以开始第一时间体验新版本了,这里先放出 PHP7.3 安装的教程以便大家升级. 适用系统: Ubuntu 18. ...
- SQL on Hadoop技术综述
一.系统架构 runtime framework v.s. mpp 在SQL on Hadoop系统中,有两种架构: 1.一种是基于某个运行时框架来构建查询引擎,典型案例是Hive: 2.另一种是仿照 ...
- Java8之list<entity>获取实体的某一字段
示例 List<String> titles = titleList.stream().map(e -> e.get(ConstantUtil.TITLE)).collect(Col ...
- ruby-on-rails-BUG
Ruby on Rails errors: (新手期) rails 自动化部署教程 Q1: rvm 无法使用 $ rvm use 1.9.3 --default RVM is not a functi ...
- JavaScript初探系列(六)——函数
一.概述 (一)函数的声明 JavaScript 有三种声明函数的方法. (1)function 命令 function命令声明的代码区块,就是一个函数.function命令后面是函数名,函数名后面是 ...
- 如何查看电脑的GPU信息
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qq_33690342/article/ ...