当前位置: 首页 > news >正文

集成Diagram Viewer跟踪流程

首先这是一篇迟来的教程,因为从5.12版本(目前最新版本为5.15.1)开始就已经提供了Diagram Viewer这个流程图跟踪组件,不管如何总归有人需要用到,所以我觉得还是要和大家分享一下。

1. 前言

目前被大家所采用的流程图跟踪有两种方式:

  • 一种是由引擎后台提供图片,可以把当前节点标记用红色
  • 一种是比较灵活的方式,先用引擎接口获取流程图(原图),然后再通过解析引擎的Activity对象逐个解析(主要是判断哪个是当前节点),最后把这些对象组成一个集合转换成JSON格式的数据输出给前端,用Javascript和Css技术实现流程的跟踪

这两种方式在kft-activiti-demo中都有演示,这里就不介绍了,参考流程跟踪部门代码即可。

2. Diagram Viewer简介

Diagram Viewer是官方在5.12版本中添加的新组件,以Raphaël为基础库,用REST(参考:《如何使用Activiti Rest模块》)方式获取JSON数据生成流程图并把流程的处理过程用不同的颜色加以标注,最终的效果如下图所示。

在应用中使用时也很方便,把这个组件的源码复制到项目中再配置一个REST拦截器,最后拼接一个URL即可;举个例子:

http://demo.kafeitu.me/kft-activiti-demo/diagram-viewer/index.html?processDefinitionId=leave-jpa:1:22&processInstanceId=27

这个URL中有两个参数:

  • processDefinitionId: 流程定义ID
  • processInstanceId: 流程实例ID

3. 集成Diagram Viewer

3.1 创建REST路由类

REST路由类源码在官方的Activiti Explorer里面有提供,代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package org.activiti.explorer.rest;
 
import org.activiti.rest.common.api.DefaultResource;
import org.activiti.rest.common.application.ActivitiRestApplication;
import org.activiti.rest.common.filter.JsonpFilter;
import org.activiti.rest.diagram.application.DiagramServicesInit;
import org.activiti.rest.editor.application.ModelerServicesInit;
import org.restlet.Restlet;
import org.restlet.routing.Router;
 
public class ExplorerRestApplication extends ActivitiRestApplication {
   
   public ExplorerRestApplication() {
     super ();
   }
   /**
    * Creates a root Restlet that will receive all incoming calls.
    */
   @Override
   public synchronized Restlet createInboundRoot() {
     Router router = new Router(getContext());
     router.attachDefault(DefaultResource. class );
     ModelerServicesInit.attachResources(router);
     DiagramServicesInit.attachResources(router);
     JsonpFilter jsonpFilter = new JsonpFilter(getContext());
     jsonpFilter.setNext(router);
     return jsonpFilter;
   }
 
}

把这个路由配置到web.xml中:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
< servlet >
     < servlet-name >ExplorerRestletServlet</ servlet-name >
     < servlet-class >org.restlet.ext.servlet.ServerServlet</ servlet-class >
     < init-param >
         <!-- Application class name -->
         < param-name >org.restlet.application</ param-name >
         < param-value >org.activiti.explorer.rest.ExplorerRestApplication</ param-value >
     </ init-param >
</ servlet >
 
< servlet-mapping >
     < servlet-name >ExplorerRestletServlet</ servlet-name >
     < url-pattern >/service/*</ url-pattern >
</ servlet-mapping >

3.2 复制Diagram Viewer组件

在官方提供的Zip文件(可以从www.activiti.org/download.html下载)中有一个wars目录,用压缩工具解压activiti-explorer.war文件,目录结构如下图:

diagram-viewer复制到项目的webapp目录(或者是WebRoot目录)下,在项目中需要跟踪的地方拼接访问diagram-viewer/index.html的URL即可,别忘记了刚刚介绍的两个重要参数。

http://demo.kafeitu.me/kft-activiti-demo/diagram-viewer/index.html?processDefinitionId=leave-jpa:1:22&processInstanceId=27

URL中有两个参数:

  • processDefinitionId: 流程定义ID
  • processInstanceId: 流程实例ID

这是一个独立的页面,你可以直接打开它或者把它嵌入在一个对话框里面(kft-activiti-demo就是用的嵌入方式)。

相关文章:

  • PHP 7.0.4 Windows升级
  • 发现一个nginx LUA开发Web App的框架
  • golang笔记——string
  • 【转】Android Support v4、v7、v13的区别和应用场景
  • 【HDOJ】4326 Game
  • js 定义类对象
  • Android 解决onInterceptTouchEvent只能拦截到Down事件
  • 本地使用SVN编辑发布远程SAE工程
  • Oracle_spatial的空间操作符介绍
  • 用JavaScript代码实现Excel表格的办法
  • 今天开始学习python
  • Robotium入门
  • permutation II (boss出来了)
  • Nginx在Window下的使用笔记
  • linux编程之GDB调试
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • go append函数以及写入
  • golang 发送GET和POST示例
  • JDK9: 集成 Jshell 和 Maven 项目.
  • leetcode386. Lexicographical Numbers
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • Rancher如何对接Ceph-RBD块存储
  • 反思总结然后整装待发
  • 来,膜拜下android roadmap,强大的执行力
  • 马上搞懂 GeoJSON
  • 三栏布局总结
  • 少走弯路,给Java 1~5 年程序员的建议
  • 首页查询功能的一次实现过程
  • 译米田引理
  • No resource identifier found for attribute,RxJava之zip操作符
  • linux 淘宝开源监控工具tsar
  • 我们雇佣了一只大猴子...
  • ​用户画像从0到100的构建思路
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • # Panda3d 碰撞检测系统介绍
  • (27)4.8 习题课
  • (7)STL算法之交换赋值
  • (待修改)PyG安装步骤
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (一)Linux+Windows下安装ffmpeg
  • (转)Windows2003安全设置/维护
  • ./configure,make,make install的作用(转)
  • .dwp和.webpart的区别
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .NET多线程执行函数
  • .Net语言中的StringBuilder:入门到精通
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • @RestControllerAdvice异常统一处理类失效原因
  • [20190401]关于semtimedop函数调用.txt
  • [BJDCTF2020]The mystery of ip