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:启动流程后动态获取流程图的更多相关文章

  1. activiti学习5:开启流程和流程前进

    目录 activiti学习5:开启流程和流程前进 一.流程和任务的关系 二.开启流程 2.1根据流程定义key开启流程 三.查询用户任务 3.1 TaskQuery 四.完成任务 activiti学习 ...

  2. Activiti 5.18启动流程到完成所有任务之间的数据库变化(转)

    来写一下Activiti 5.18版本从启动流程到整个流程结束之间数据库表的变化 先给出流程图,很简单的流程,就是两个UserTask: 代码如下: DeploymentBuilder builder ...

  3. Activiti学习笔记4 — 流程实例化

    1.创建流程引擎对象 private ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); 2.启动流程 流程 ...

  4. activity通过流程实例id动态获取流程图并展示在jsp页面上

    提供的Service方法如下: Java /** * 获取当前任务流程图 * * @param processInstanceId * @return */ @Override public Inpu ...

  5. RTT学习之启动流程

    总结RT-Thread的启动流程. 非运行时与运行时的image文件分别是什么样的,请画下来.是谁将 RW 段中的  RW-data(初始化的全局变量)搬运到 RAM 中? MDK环境下各种数据段存储 ...

  6. 反射学习2-通过反射机制动态获取属性的值模拟Struts的自动赋值

    一.准备知识:   Java反射机制   处理事务的JavaBean   String的操作常用方法 二.模拟步骤   这里我们通过反射机制动态获取属性的值模拟Struts中的自动赋值. 1.首先创建 ...

  7. CentOS6启动流程(含详细流程图)

    参考:Linux启动流程和grub详解(作者:好笔记运维) 为什么把这位的参考放在前面,主要是这位大佬的流程图太详细了.虽说不一定要了解这么详细,但还是很佩服啊.不多说,上图(在新标签中打开图片) 下 ...

  8. Activiti学习笔记3 — 流程定义

    一.创建流程引擎对象 private ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); 二.发布一个流程 ...

  9. java框架之SpringBoot(10)-启动流程及自定义starter

    启动流程 直接从 SpringBoot 程序入口的 run 方法看起: public static ConfigurableApplicationContext run(Object source, ...

随机推荐

  1. UNICODE和UCS

    Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案.目前的Unicode字符分为17组编排,0x0000 至 0xFFFF,每组称为平面(Plane),而每平面拥有65536个码 ...

  2. 51nod1681 公共祖先

    [传送门] 很明显,可以转化成求每个点在两棵树中对应的子树中有多少个相同的节点,对答案的贡献就是$C(x, 2)$.关键就是怎么求这个东西.一是,对第一棵树求出dfs序,然后dfs第二棵树,用树状数组 ...

  3. 修改git log中的Date格式

    默认的git log查看日志显示的格式如下: Date:   Thu Aug 16 17:44:32 2018 +0800 说实话,真不太喜欢这种日期格式还是换成数值比较舒服一点.git bash中使 ...

  4. Cloud-init原理

    Ubuntu修改主机名后,重启自动恢复原来的主机名? 这是因为Ubuntu18.10上,默认安装并启动了cloud-init, 需要停止它的四个服务进程,才可以使用传统的方式修改主机名. cloud- ...

  5. Gamma阶段第四次scrum meeting

    每日任务内容 队员 昨日完成任务 明日要完成的任务 张圆宁 #91 用户体验与优化https://github.com/rRetr0Git/rateMyCourse/issues/91(持续完成) # ...

  6. FCN内容通读

    本文完全为个人心得体会,只做记录用,欢迎交流 替换全连接层为卷积层 以alexnet为例,替换了最后三层fc为卷积层,得到的是通道数很大(4096)而长宽很小的输出,其实我不太能理解这里的创新点,或许 ...

  7. docker run 中的privileged参数

    docker 应用容器 获取宿主机root权限(特殊权限-) docker run -d --name="centos7" --privileged=true centos:7 / ...

  8. Debian 9安装java与设置环境变量

    安装默认JRE / JDK 先更新软件包索引: apt update 检查是否已安装Java: java -version 如果当前未安装Java,您将看到以下输出: Output-bash: jav ...

  9. pycharm把制表符(tab)转换为空格(PEP8)

    pycharm把制表符转换为4个空格 pycharm显示空格

  10. 基于redis5的session共享:【redis 5.x集群应用研究】

    基于springsession构建一个session共享的模块. 这里,基于redis的集群(Redis-5.0.3版本),为了解决整个物联网平台的各个子系统之间共享session需求,且方便各个子系 ...