图形化查看执行位置(或者称为:查看活动坐标显示在图中的图形位置)
完成起来只需要特殊两部分:
1、发布的时候打包进png图片,显示图形位置时取出(或不打包进发布,能够拼出位置也可)
如:
InputStream in = new FileInputStream(
"F:\\workspace\\jbpm\\workspace\\hello_jbpm\\src\\main\\resources\\leave.zip");
ZipInputStream zipInputStream = new ZipInputStream(in);
jpdlDeployManager.processEngine.getRepositoryService().createDeployment()
.addResourcesFromZipInputStream(zipInputStream).deploy();
取出:
// 取出发布id中资源的io流
inputStream = repositoryService.getResourceAsStream(deploymentId, resourceName);
2、取出当前活动坐标
什么意思呢?jbpm4为我们提供一个对象ActivityCoordinates,用于描述某个活动节点相对于图形中的坐标(横坐标、纵坐标、执行任务在图形中的高度和宽度)
/** activity coordinates indicating the graphical position in the diagram.
*
* @see RepositoryService#getActivityCoordinates(String, String)
* @author Tom Baeyens
*/
public interface ActivityCoordinates {
int getX();
int getY();
int getWidth();
int getHeight();
}
获取此对象:
/**
* 获取活动坐标显示在图中的图形位置
*
* @param processInstance
* 流程实例
* @return
*/
public static ActivityCoordinates getActivityCoordinates(ProcessInstance processInstance) {
// 两个参数:1个为流程定义id;另一个为流程定义图形中具体活动的名称(或者说当前活动的名称)。
return repositoryService.getActivityCoordinates(processInstance.getProcessDefinitionId(), processInstance
.findActiveActivityNames().iterator().next());
}
helloworld:
首先是我们的业务处理类,我们进行了封装,具体查看注释
package com.partner4java.service;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import org.jbpm.api.Configuration;
import org.jbpm.api.ExecutionService;
import org.jbpm.api.ProcessDefinition;
import org.jbpm.api.ProcessEngine;
import org.jbpm.api.ProcessInstance;
import org.jbpm.api.RepositoryService;
import org.jbpm.api.TaskService;
import org.jbpm.api.model.ActivityCoordinates;
import org.jbpm.api.task.Task;
/**
* 图片展示执行位置服务类<br/>
* 提供了两类方法:获取当前流程定义的图形和获取当前活动坐标。<br/>
* 两类方法都分别有两份:一份是根据taskId获取,另一份是根据processInstanceId获取
*
* @author partner4java
*
*/
public class PicViewService {
public static ProcessEngine processEngine = Configuration.getProcessEngine();
public static RepositoryService repositoryService = processEngine.getRepositoryService();
public static ExecutionService executionService = processEngine.getExecutionService();
public static TaskService taskService = processEngine.getTaskService();
/** 保存已经查询过的流程定义id对应的图片地址 */
private static ConcurrentMap<String, String> picViewNames = new ConcurrentHashMap<String, String>();
/**
* 获取图片URL地址<br/>
* 打包的png图片名字需与jpdl的name属性名字一致
*
* @param taskId
* 任务id
* @return 如:"jbpm/pic/leave_1.png",相对于web根目录的位置
*/
public static String getPicViewByTaskId(String taskId) {
// 根据taskId获取任务
Task task = taskService.getTask(taskId);
// 根据任务获取执行id
String executionId = task.getExecutionId();
return getPicView(executionId);
}
/**
* 获取图片URL地址<br/>
* 打包的png图片名字需与jpdl的name属性名字一致
*
* @param processInstanceId
* 流程实例id
* @return 如:"jbpm/pic/leave_1.png",相对于web根目录的位置
*/
public static String getPicView(String processInstanceId) {
// 先根据流程实例id拿到流程实例
ProcessInstance processInstance = executionService.findProcessInstanceById(processInstanceId);
// 然后根据流程实例拿到流程定义id
String processDefinitionId = processInstance.getProcessDefinitionId();
String fileName = doGetPivView(processDefinitionId);
return fileName;
}
/**
* 获取图片URL地址<br/>
* 打包的png图片名字需与jpdl的name属性名字一致
*
* @param processDefinitionId
* 流程定义id
* @return 如:"jbpm/pic/leave_1.png",相对于web根目录的位置
*/
private static String doGetPivView(String processDefinitionId) {
// 先判断一下有没有取过,如果取过直接返回缓存地址
String cachePicName = picViewNames.get(processDefinitionId);
if (cachePicName != null) {
return cachePicName;
}
// 根据流程实例id拿到流程实例
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.processDefinitionId(processDefinitionId).uniqueResult();
// 根据流程实例拿到发布id(和processDefinitionId的区别一般就是没有key和横杠标识)
String deploymentId = processDefinition.getDeploymentId();
// 默认和name属性的名字相同
String resourceName = processDefinition.getName() + ".png";
InputStream inputStream = null;
FileOutputStream fileOutputStream = null;
BufferedOutputStream out = null;
String fileName = getFileName(processDefinitionId);
try {
// 取出发布id中资源的io流
inputStream = repositoryService.getResourceAsStream(deploymentId, resourceName);
// 创建一个文件写入(这里我们做了cache),当然你也可以输出到out中response.getOutputStream().write(b,
// 0, len);
File file = createFile(fileName);
fileOutputStream = new FileOutputStream(file);
out = new BufferedOutputStream(fileOutputStream);
byte[] b = new byte[1024];
int len = -1;
while ((len = inputStream.read(b, 0, 1024)) > -1) {
out.write(b, 0, len);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
fileName = "jbpm/pic/" + processDefinitionId.replace("-", "_") + ".png";
picViewNames.put(processDefinitionId, fileName);
return fileName;
}
/**
* 创建文件目录
*
* @param fileName
* @return
* @throws IOException
*/
private static File createFile(String fileName) throws IOException {
File file = new File(fileName);
File parentFile = file.getParentFile();
if (parentFile != null && !parentFile.exists()) {
parentFile.mkdirs();
}
return file;
}
/**
* 获取文件的磁盘路径
*
* @param processDefinitionId
* @return
*/
public static String getFileName(String processDefinitionId) {
URL url = PicViewService.class.getClassLoader().getResource("");
if (url != null) {
String path = url.getPath();
path = path.replace("/WEB-INF/classes", "");
return path + "jbpm/pic/" + processDefinitionId.replace("-", "_") + ".png";
}
return null;
}
/**
* 获取活动坐标显示在图中的图形位置
*
* @param taskId
* 任务id
* @return
*/
public static ActivityCoordinates getActivityCoordinatesByTaskId(String taskId) {
// 根据taskId获取任务
Task task = taskService.getTask(taskId);
// 根据任务获取执行id
String executionId = task.getExecutionId();
return getActivityCoordinates(executionId);
}
/**
* 获取活动坐标显示在图中的图形位置
*
* @param processInstanceId
* 流程实例id
* @return
*/
public static ActivityCoordinates getActivityCoordinates(String processInstanceId) {
ProcessInstance processInstance = executionService.findProcessInstanceById(processInstanceId);
return getActivityCoordinates(processInstance);
}
/**
* 获取活动坐标显示在图中的图形位置
*
* @param processInstance
* 流程实例
* @return
*/
public static ActivityCoordinates getActivityCoordinates(ProcessInstance processInstance) {
// 两个参数:1个为流程定义id;另一个为流程定义图形中具体活动的名称(或者说当前活动的名称)。
return repositoryService.getActivityCoordinates(processInstance.getProcessDefinitionId(), processInstance
.findActiveActivityNames().iterator().next());
}
}
有了服务类,然后是我们的servlet:
package com.partner4java.web;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.jbpm.api.model.ActivityCoordinates;
import com.partner4java.service.PicViewService;
/**
* 以图形的形式展示工作流执行的位置<br/>
* 如:http://localhost:8080/jbpm_pic/view/pic?taskid=20008或http://localhost:8080/jbpm_pic/view/pic?piid=leave.20001
* @author partner4java
*
*/
public class PicViewServlet extends HttpServlet {
private static final long serialVersionUID = -1307016588425325378L;
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String fileName = null;
ActivityCoordinates activityCoordinates = null;
String processInstanceId = req.getParameter("piid");
// 先根据流程实例id取
if (processInstanceId != null && !"".equals(processInstanceId)) {
fileName = PicViewService.getPicView(processInstanceId);
activityCoordinates = PicViewService.getActivityCoordinates(processInstanceId);
}
// 再根据任务id
else {
String taskId = req.getParameter("taskid");
if (taskId != null && !"".equals(taskId)) {
fileName = PicViewService.getPicViewByTaskId(taskId);
activityCoordinates = PicViewService.getActivityCoordinatesByTaskId(taskId);
}
}
req.setAttribute("fileName", fileName);
req.setAttribute("activityCoordinates", activityCoordinates);
req.getRequestDispatcher("/WEB-INF/view.jsp").forward(req, resp);
}
}
最后是我们的jsp:
<body>
<img src="${fileName }"
style="position:absolute;left:0px;top:0px;">
<div
style="position:absolute;border:1px solid red;left:${activityCoordinates.x}px;top:${activityCoordinates.y}px;width:${activityCoordinates.width}px;height:${activityCoordinates.height}px;"></div>
</body>
效果如图:(红框标出了执行位置)
代码下载地址:http://download.csdn.net/detail/partner4java/5013331(你也可以按照servlet注释格式的地址访问,debug进代码看执行流程和涉及到的方法)
分享到:
相关推荐
《partner4java 讲述jBPM4》之第三步:图形化查看执行位置 http://blog.csdn.net/partner4java/article/details/8518312
jbpm4 helloworld,详细参考 《partner4java 讲述jBPM4》之第一步:jBPM4概念 & helloworld http://blog.csdn.net/partner4java
jbpm jbpm4.3.jar DDDDDDDD
java源代码分包详解JBPM4 java源代码分包详解JBPM4
jbpm4源码jbpm4源码jbpm4源码
本文件从JBPM的原理、实现方法、实例等方面详细讲解了JBPM的原理,包括以下内容: 1、JBPM特色: 3 2、流程图的组成: 3 2.1流转 (TRANSITION) 3 2.2活动 (ACTIVITY) 3 3、所用到的表: 4 3.1资源库与运行时表结构:...
java 实现的jbpm Demo,一个简单的请假流程
jbpm designer (基于web的图形化流程设计工具)
压缩包中有2个文件:工作流基础.pdf、安装和配置jBPM4.pdf,想了解工作流,自己下看吧
jbpm应用开发指面(胡奇) jbpm4.3表结构和表字段说明 [jBPM开发指南].高杰.文字版 jBPM5_用户手册-中文版
jbpm4流程提交及执行完整代码,把每个文件放到对应的位置即可。 生成流程跟踪图的方法见: http://download.csdn.net/source/2905937
jbpm工作流教程,4.1版本的Java工作流
流程开发java插件jbpm 使用说明 个人总结工具介绍使用
JBPM4 SSH EXTJS JBPM SSH EXTJS JBPM4 SSH EXTJS JBPM SSH EXTJS JBPM4 SSH EXTJS JBPM SSH EXTJS JBPM4 SSH EXTJS JBPM SSH EXTJS 希望对大家有帮助。
jbpm java
1.6 JBPM_DELEGATION:流程代理类表(用于实例化jbpm中的action类) 6 1.7 JBPM_TASK:流程任务表 6 1.8 JBPM_TASKCONTROLLER:流程任务控制器 7 1.9 JBPM_VARIABLEACCESS:流程变量表 7 1.10 JBPM_MODULEDEFINITION...
jboss jbpm4最新开发包 采用了pvm框架
jbpm4。4中表之间的关系,jbpm4 表关系
大家在做jbpm的时候,肯定会考虑到将工作流提升到用户层面,让用户可以设计流程,而不是只在myeclipse中由程序员设计,这个软件就是这个作用,有需要的人可以下载。 注意:该文件是免费版,具备的功能是:图形化流程...
jbpm 开发实例 jbpm 开发实例 jbpm 开发实例