Activiti生成流程监控图片的方式总共有两种
1.利用自身所带的API进行生成,这种方式的核心类为ProcessDiagramGenerator.generateDiagram(pde, "png",
activityIds);
这种方式的主要目的是生成图片,然后在返回网页端显示,如果不改源码的话,只能显示正在执行的任务,历史任务无法显示.
生成的主要代码如下所示:
ProcessInstance processInstance = runtimeService
.startProcessInstanceByKey("process1");
taskService.complete(taskService.createTaskQuery().singleResult()
.getId());
// 得到流程定义实体类
ProcessDefinitionEntity pde = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService)
.getDeployedProcessDefinition(processInstance
.getProcessDefinitionId());
//得到流程执行对象
List<Execution> executions = runtimeService.createExecutionQuery()
.processInstanceId(processInstance.getId()).list();
//得到正在执行的Activity的Id
List<String> activityIds = new ArrayList<String>();
for (Execution exe : executions) {
List<String> ids = runtimeService.getActiveActivityIds(exe.getId());
activityIds.addAll(ids);
}
InputStream in = ProcessDiagramGenerator.generateDiagram(pde, "png",
activityIds);
FileOutputStream out = new FileOutputStream("f:\\watch.png");
FileCopyUtils.copy(in, out);
2.还有一种方式是先把流程图在页面显示,然后返回页面时通过定义各个Activiti实体的坐标自主画边框显示流程进行到哪一个节点,这种方式的好处是可以自行控制显示历史节点以及正在执行的节点.
后台代码:
repositoryService.createProcessDefinitionQuery().singleResult();
InputStream in = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(), processDefinition.getDiagramResourceName());
OutputStream out = response.getOutputStream();
FileCopyUtils.copy(in, out);
// 得到流程定义实体类
ProcessDefinitionEntity pde = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService)
.getDeployedProcessDefinition(processInstance
.getProcessDefinitionId());
// 得到流程执行对象
List<Execution> executions = runtimeService.createExecutionQuery()
.processInstanceId(processInstance.getId()).list();
// 得到正在执行的Activity的Id
List<String> activityIds = new ArrayList<String>();
for (Execution exe : executions) {
List<String> ids = runtimeService.getActiveActivityIds(exe.getId());
activityIds.addAll(ids);
}
List<Map<String, Integer>> list = new ArrayList<Map<String, Integer>>();
for (String id : activityIds) {
ActivityImpl activity = pde.findActivity(id);
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("x", activity.getX());
map.put("y", activity.getY());
map.put("width", activity.getWidth());
map.put("height", activity.getHeight());
list.add(map);
}
request.setAttribute("list", list);
// 历史环节
List<HistoricActivityInstance> historicActivityInstances = historyService
.createHistoricActivityInstanceQuery().list();
List<String> historyIds = new ArrayList<String>();
for (HistoricActivityInstance h : historicActivityInstances) {
if (h.getEndTime() != null && "userTask".equals(h.getActivityType())) {
historyIds.add(h.getActivityId());
}
}
List<Map<String, Integer>> list2 = new ArrayList<Map<String, Integer>>();
for (String id : historyIds) {
ActivityImpl activity = pde.findActivity(id);
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("x", activity.getX());
map.put("y", activity.getY());
map.put("width", activity.getWidth());
map.put("height", activity.getHeight());
list2.add(map);
}
request.setAttribute("list2", list2);
int minX = Integer.MAX_VALUE;
int minY = Integer.MAX_VALUE;
List<ActivityImpl> activities = pde.getActivities();
for (ActivityImpl activity : activities) {
if (activity.getX() < minX) {
minX = activity.getX();
}
if (activity.getY() < minY) {
minY = activity.getY();
}
}
request.setAttribute("minX", minX - 4);
request.setAttribute("minY", minY - 4);
request.getRequestDispatcher("watch.jsp").forward(request, response);
}
前台页面代码:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<c:forEach items="${list }" var="m">
<div style="height: ${m.height }px; width: ${m.width }px; top: ${m.y }px; left: ${m.x }px; z-index: 10;position: absolute;border: 2px solid red;">
</div>
</c:forEach>
<c:forEach items="${list2 }" var="m">
<div style="height: ${m.height }px; width: ${m.width }px; top: ${m.y}px; left: ${m.x }px; z-index: 10;position: absolute;border: 2px solid blue;">
</div>
</c:forEach>
<div style="position: absolute; top: ${minY }px; left: ${minX}px; z-index: 1;">
<img alt="..." src="ProcessPng">
</div>
</body>
</html>
分享到:
相关推荐
【工作流Activiti5学习总结】 工作流管理系统(Workflow Management System, WfMS)是企业信息化建设中的重要组成部分,它负责协调和管理业务流程。Activiti5是一款开源的工作流引擎,由Alfresco公司开发,它基于...
这个"002_activiti学习总结.zip"文件显然包含了一份关于Activiti的学习笔记,可能涵盖了从基础到进阶的各种概念。以下是对这些知识点的详细说明: 1. **流程定义(Process Definition)**:流程定义是Activiti的...
在本篇博客“工作流Activiti的学习总结(十二)activiti官方十分钟快速学习”中,作者分享了关于Activiti工作流引擎的快速学习经验。Activiti是一个开源的、基于Java的企业级工作流引擎,它被广泛应用于自动化业务...
Activiti学习文档 #### 概述 Activiti是一个开源的工作流引擎,用于构建业务流程自动化应用。它支持完整的业务流程管理生命周期,并且提供了丰富的API来满足不同的应用场景需求。本文档将深入探讨Activiti的核心...
### Activiti流程学习总结 #### 一、工作流的基本概念 在深入了解Activiti之前,我们需要先理解工作流的概念。工作流是一种将业务过程部分或全部自动化的方法,它可以帮助组织提高工作效率,减少错误,并且能够更...
### Activiti工作流学习总结 #### 一、Activiti学习资源汇总 - **官方网站**: 提供了Activiti的最新版本信息、文档和技术支持等。地址为:[http://www.activiti.org/](http://www.activiti.org/) - **下载页面**: ...
总结来说,“Activiti学习文档(二)之画流程图并部署流程”会带你走过从设计到实施一个完整流程的整个过程,包括理解BPMN符号、使用工具绘制流程图、编写部署脚本,以及如何在实际环境中运行和管理流程实例。...
工作流引擎Activiti是开源的工作流引擎,这是一份简单的使用总结,希望对大家有用。
标题中的“工作流Activiti的学习总结(八)Activiti自动执行的应用”表明本文将探讨如何在Activiti工作流引擎中实现任务的自动化执行。Activiti是一个开源的工作流和业务流程管理(BPM)系统,广泛应用于企业级应用...
总结,这个学习资料包提供了全面了解和掌握 Activiti 的资源,包括理论知识、实践操作以及与流行开发框架的集成。无论是新手还是经验丰富的开发者,都能从中受益,提升在业务流程自动化方面的技能。
以上是对Activiti使用的一些核心知识点的总结,对于学习和使用Activiti的朋友来说,这些都是理解和应用 Activiti 必不可少的基础。通过深入理解和实践,你可以利用Activiti构建出高效、灵活的业务流程管理系统。
这个“activiti学习资料文档”压缩包很可能是为那些希望深入理解Activiti工作流引擎和BPM概念的学习者准备的。下面,我们将详细探讨Activiti的相关知识点,以及如何通过这些资料进行学习。 一、Activiti简介 ...
总结,Activiti中的ReceiveTask是一个等待外部事件触发的节点,它使得流程能够灵活响应外部世界的变化。通过熟练掌握ReceiveTask的使用,开发者可以构建出更加动态和响应式的业务流程。同时,深入研究源码和利用提供...
### Activiti5学习笔记核心知识点解析 #### 一、Activiti5概述与环境搭建 **Activiti5**是一款开源的工作流引擎,基于Java语言开发,主要用于实现业务流程管理(BPM)和工作流自动化。其核心特性包括流程建模、...
总结,理解并充分利用 Activiti 的流程执行历史记录功能,是深入掌握 Activiti 并提升业务流程管理效率的重要步骤。通过查询和分析历史数据,我们可以更好地了解流程运行状态,发现问题,优化流程,并为企业的决策...
Activiti是一个轻量级的、易用的BPM(Business Process Management,即业务流程管理)框架,它允许开发者通过使用Java类库实现工作流引擎。Activiti的目的是提供一种轻便、灵活的工具,帮助开发者构建BPM应用程序,...
总结,Activiti 的开始活动节点是流程的起点,而流程是否结束则需要通过查询流程实例和历史流程实例的状态来判断。理解并熟练掌握这些概念和操作,将有助于我们在实际项目中更有效地管理和优化业务流程。通过 ...
总结,Activiti 中的并行网关是构建复杂流程设计的重要工具,它可以提高流程执行的效率,适应多任务并行处理的需求。理解并熟练运用并行网关,能帮助我们更好地设计和优化业务流程。在实际应用中,应根据具体业务...