1.写在前面:
activiti中并发后的活动任务节点通过runtimeService.getActiveActivityIds(String proInstId)得到。
这个方法在Activiti的doc文档中介绍的不对,它错把参数写成了executionId,而事实上,一个流程实例(对应流程实例编号ProInstId)在运行中通过并发节点产生多个执行任务(对应执行编号executionId)。
2.关键代码:
ProcessInstanceAction.java
Java代码
public class ProcessInstanceAction extends BaseAction {
private List<ActivityImpl> actImpls = new ArrayList<ActivityImpl>();
public List<ActivityImpl> getActImpls() {
return actImpls;
}
public void setActImpls(List<ActivityImpl> actImpls) {
this.actImpls = actImpls;
}
/**
* 显示流程图
*
* @return
* @throws Exception
*/
public String getProcessPic() throws Exception {
// String taskId = // "2901";//getRequest().getParameter("taskId");3016,552,3020
String procDefId = getRequest().getParameter("procDefId");
ProcessDefinition procDef = repositoryService.createProcessDefinitionQuery().processDefinitionId(procDefId).singleResult();
String diagramResourceName = procDef.getDiagramResourceName();
InputStream imageStream = repositoryService.getResourceAsStream(procDef.getDeploymentId(), diagramResourceName);
getRequest().setAttribute("inputStream", imageStream);
return SUCCESS;
}
/**
* 获取跟踪信息
*
* @return
* @throws Exception
*/
public String getProcessMap() throws Exception {
String procDefId = getRequest().getParameter("procDefId");
String proInstId = getRequest().getParameter("procInstId");
ProcessDefinition processDefinition = repositoryService .createProcessDefinitionQuery().processDefinitionId(procDefId) .singleResult();
ProcessDefinitionImpl pdImpl = (ProcessDefinitionImpl) processDefinition;
String processDefinitionId = pdImpl.getId();// 流程标识 ProcessDefinitionEntity def = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService) .getDeployedProcessDefinition(processDefinitionId);
List<ActivityImpl> activitiList = def.getActivities();// 获得当前任务的所有节点
/****/
List<String> ActiveActivityIds = runtimeService.getActiveActivityIds(proInstId);
for (String activeId : ActiveActivityIds) {
for (ActivityImpl activityImpl : activitiList) {
String id = activityImpl.getId();
if (activityImpl.isScope()) {
if (activityImpl.getActivities().size() > 1) {
List<ActivityImpl> subAcList = activityImpl .getActivities();
for (ActivityImpl subActImpl : subAcList) { String subid = subActImpl.getId();
System.out.println("subImpl:" + subid);
if (activeId.equals(subid)) {// 获得执行到那个节点
actImpls.add(subActImpl);
break;
}
}
}
}
if (activeId.equals(id)) {// 获得执行到那个节点
actImpls.add(activityImpl);
System.out.println(id);
}
}
}
/****/
return SUCCESS;
}
}
pic.jsp
Html代码
<%@page import="java.io.InputStream"%>
<%@page import="org.activiti.engine.impl.*"%>
<%@page import="org.activiti.engine.impl.pvm.*"%>
<%@page import="org.activiti.engine.impl.pvm.process.*"%>
<%@page import="org.activiti.engine.repository.*"%>
<%@page import="org.activiti.engine.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
InputStream is = (InputStream)request.getAttribute("inputStream");
byte[] b = new byte[1024];
int len = -1;
while((len = is.read(b, 0, 1024)) != -1) {
response.getOutputStream().write(b, 0, len);
// 防止异常:getOutputStream() has already been called for this response out.clear();
out = pageContext.pushBody();
} %>
showImg.jsp
Html代码
<%@page import="java.io.InputStream"%>
<%@page import="org.activiti.engine.impl.*"%>
<%@page import="org.activiti.engine.impl.pvm.*"%>
<%@page import="org.activiti.engine.impl.pvm.process.*"%>
<%@page import="org.activiti.engine.repository.*"%>
<%@page import="org.activiti.engine.*"%>
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>
</title>
</head>
<body>
<div >
<img src="getProcessPic.action?procDefId=${procDefId}" style="position:absolute; left:0px; top:0px;">
<s:iterator value="actImpls">
<%System.out.println("lala"); %>
<!-- 给执行的节点加框 -->
<div style="position:absolute; border:2px solid red;left:${x-1 }px;top:${y-1 }px;width:${width }px;height:${height }px;"></div>
</s:iterator>
</div>
</body>
</html>
另附:环境配置struts+activiti:
struts.xml
Xml代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts>
<constant name="struts.objectFactory.spring.autoWire" value="name" /> <constant name="struts.objectFactory" value="spring" />
<package name="default" extends="struts-default">
<action name="getProcessPic" class="processInstanceAction" method="getProcessPic">
<result name = "success" >/incident/pic.jsp</result>
</action>
<action name="getProcessMap" class="processInstanceAction" method="getProcessMap">
<result name = "success" >/incident/showImg.jsp</result>
</action>
</package>
</struts>
分享到:
相关推荐
Activiti提供了动态获取流程图的功能,通过DefaultProcessDiagramGenerator类和repositoryService组件,可以根据流程定义id或流程实例id来绘制流程图。同时,高亮显示的节点可以通过runtimeService服务组件和...
该版本可能增强了对云环境的支持,提高了并发处理能力,并提供了一套丰富的工具集用于流程设计和监控。Activiti强调简洁的API设计,使得开发者能快速理解和使用。 两者之间的比较: 1. 流程模型:Flowable在BPMN ...
Activiti 插件支持 BPMN 2.0,允许用户创建复杂的流程图,包括任务、决策点、事件和并发流等元素。 3. **Eclipse IDE**:Eclipse 是一款强大的开放源代码集成开发环境,广泛用于Java应用开发,但也支持其他编程语言...
这些元素通过连线连接,形成一个完整的流程图。 **三、Activiti Designer** 为了方便流程设计,Activiti提供了一个名为Activiti Designer的Eclipse插件,允许开发者使用图形化界面设计流程。设计完成后,可以导出`....
- **流程图**:可视化流程图展示。 - **XML内容**:对应的BPMN XML文件。 - **启动一个流程实例**:通过代码启动流程实例。 - **任务列表**:展示当前待办任务。 - **领取任务**:用户领取任务。 - **完成任务**:...
在这个实例中,我们可能会看到如何使用 Activiti 的 API 和相关工具创建 BPMN 流程图,包括启动流程、处理任务、信号和事件等。 首先,我们需要了解 Activiti 的核心概念: 1. **流程定义**:这是 BPMN 图形的代码...
2. **流程图(Process Diagram)**:案例可能包含流程图,它们是BPMN符号的可视化表示,帮助用户理解流程的结构。你可以通过这些图表理解流程的流转逻辑,如任务如何分配、条件判断在哪里、如何处理并发任务等。 3....
在描述中提到的"Canvas动画"是指Activiti提供的可视化建模工具,它允许开发者通过拖拽方式创建流程图,并以动画形式展示流程执行的过程,使得流程设计更加直观易懂。这种动态演示方式有助于开发者和业务人员更好地...
2. **模型器(Modeler)**:Activiti 提供了一个可视化的模型器,让用户可以拖放元素来创建流程图。这使得非程序员也能设计和理解复杂的业务流程。 3. **部署(Deployment)**:流程定义完成后,需要部署到Activiti...
3. **流程建模**:使用Eclipse或Alfresco Activiti Modeler等工具,创建和编辑流程图。 4. **API使用**:学习如何通过Java API启动流程实例,查询任务,完成任务,以及操作流程变量。 5. **实战演练**:通过实际...
1. 打开 Activiti 的流程设计器,选择“并行网关”元素,拖放到流程图中。 2. 连接网关:使用顺序流(Sequence Flow)连接并行网关与其他活动,定义流程的分支和汇聚路径。 3. 设置条件:如果需要,可以在顺序流上...
BPMN(Business Process Model and Notation)是一种图形化表示方法,使得非技术人员也能理解流程图。 2. **BPMN 2.0支持**: Activiti-5.22.0 遵循BPMN 2.0规范,这意味着它支持如任务、网关、事件、子流程等元素...
3. **创建流程定义**:设计 BPMN 2.0 流程图,并将其保存为 `.bpmn` 文件。 4. **启动流程引擎**:在 SpringBoot 启动类或配置类中,配置并启动 Activiti 引擎。 5. **编写业务代码**:根据业务需求,编写与流程相关...
Spring Activiti是一个基于Java的企业级工作流引擎,它与Spring框架深度集成,为开发者提供了强大的业务流程管理(BPM)能力。在这个“spring-activiti验证demo”中,你将找到一个实例,展示了如何在实际项目中应用...
1. 流程设计:使用 BPMN 工具(如 Activiti Modeler 或 Eclipse 插件)设计流程图,导出 BPMN XML 文件。 2. 部署流程:将 BPMN XML 文件部署到 Activiti 引擎,创建流程定义。 3. 启动流程:通过 API 或用户界面...
- **流程可视化**:提供Web界面供用户设计和查看流程图,增强了用户体验。 - **任务管理**:提供任务分配、委托、完成等功能,支持多任务并发执行。 - **表单集成**:可与前端表单系统集成,实现业务数据的提交和...
1. 管理台:Activiti 提供了一个Web管理界面,用于监控和管理流程实例,查看流程图,以及进行其他管理操作。 2. 日志与调试:通过日志系统,可以跟踪和分析流程运行情况,辅助定位和解决问题。 八、最佳实践与案例 ...
这个资源包显然包含了Activiti7的项目实例以及一个用于绘制BPMN2.0流程图的工具,使得学习和使用Activiti7变得更加直观和便捷。 首先,我们要理解什么是Activiti7。Activiti7是Alfresco Software Inc.开发的一个轻...
以上只是Activiti 6.0中文API的一部分核心概念,实际使用时,开发者还需要理解流程图的构造、数据库模型、事务管理、并发控制等细节。通过深入学习和实践,可以充分利用Activiti来构建高效、灵活的业务流程管理系统...
它提供了丰富的符号集,如开始事件、结束事件、任务、网关和泳道等,使非技术人员也能理解流程图。Activiti支持BPMN 2.0,使得流程设计直观且易于理解。 3. **请假流程实例**: 这个教程可能涵盖了一个完整的请假...