经过上一节的学习,我们已经将真整个请假流程的部署,发起以及执行分配都集成到web应用中,这里我们要做的新工作是为我们之前发布的请假流程实现流程图的跟踪。
1、流程定义图片生成
流程定义的图片生成很简单,这个工作jbpm4已经帮我们完成了,所以我们只需要将编辑好的流程定义保存即可,如下图6-1所示:
图6-1 自动生成流程定义png图片
2、更改流程定义发布方式
为了要在web应用中显示流程图片,我们要将流程图片和流程定义一并的发布。
首先将leave.jpdl.xml和leave.png打包成leave.zip压缩文件。然后更改流程定义的发布方式,主要是更改deploy.jsp的源码
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.util.*,org.jbpm.api.*,java.util.zip.*" %> <!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=UTF-8"> <title>Insert title here</title> </head> <body> <% ProcessEngine processEngine=Configuration.getProcessEngine(); RepositoryService repositoryService=processEngine.getRepositoryService(); //repositoryService.createDeployment().addResourceFromClasspath("leave.jpdl.xml").deploy(); ZipInputStream zis = new ZipInputStream(this.getClass() .getResourceAsStream("/leave.zip")); repositoryService.createDeployment() .addResourcesFromZipInputStream(zis).deploy(); response.sendRedirect("index.jsp"); %> </body> </html>
3、获取当前活动的task任务
我们主要通过view.jsp实现获得当前正在活动的任务,view.jsp的代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@page import="org.jbpm.api.*,java.util.*,org.jbpm.api.model.*" %> <% String id = request.getParameter("id"); ProcessEngine processEngine = Configuration.getProcessEngine(); RepositoryService repositoryService = processEngine.getRepositoryService(); ExecutionService executionService = processEngine.getExecutionService(); ProcessInstance processInstance = executionService.findProcessInstanceById(id); Set<String> activityNames = processInstance.findActiveActivityNames(); ActivityCoordinates ac = repositoryService.getActivityCoordinates(processInstance.getProcessDefinitionId(),activityNames.iterator().next()); %> <!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=UTF-8"> <title>Insert title here</title> </head> <body> <img src="pic.jsp?id=<%=id %>" style="position:absolute;left:0px;top:0px;"> <div style="position:absolute;border:1px solid red;left:<%=ac.getX()%>px;top:<%=ac.getY()%>px;width:<%=ac.getWidth()%>px;height:<%=ac.getHeight()%>px;"></div> </body> </html>对于这段代码,作如下解释:
1)活动任务的相关属性获得
//获得当前id对应的流程实例 ProcessInstance processInstance = executionService.findProcessInstanceById(id); //或等当前流程实例的活动任务名称 Set<String> activityNames = processInstance.findActiveActivityNames(); //获得当前流程实例活动任务的坐标属性 ActivityCoordinates ac = repositoryService.getActivityCoordinates(processInstance.getProcessDefinitionId(),activityNames.iterator().next());
<img src="pic.jsp?id=<%=id %>" style="position:absolute;left:0px;top:0px;">这里我们调用了pic.jsp其代码如下:
<%@page import="org.jbpm.api.*,java.io.*"%> <% ProcessEngine processEngine = Configuration.getProcessEngine(); RepositoryService repositoryService = processEngine .getRepositoryService(); ExecutionService executionService = processEngine .getExecutionService(); String id = request.getParameter("id"); //获得当前id对应流程实例 ProcessInstance processInstance = executionService .findProcessInstanceById(id); //获得当前流程实例对应流程定义id String processDefinitionId = processInstance .getProcessDefinitionId(); //根据流程定义id最终获得当前流程实例id对应的流程定义 ProcessDefinition processDefinition = repositoryService .createProcessDefinitionQuery().processDefinitionId( processDefinitionId).uniqueResult(); //由流程定义或等当前流程定义对应的图片,并生成inputStream流显示出来 InputStream inputStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(),"leave.png"); byte[] b = new byte[1024]; int len = -1; while ((len = inputStream.read(b, 0, 1024)) != -1) { response.getOutputStream().write(b, 0, len); } %>
<div style="position:absolute;border:1px solid red;left:<%=ac.getX()%>px;top:<%=ac.getY()%>px;width:<%=ac.getWidth()%>px;height:<%=ac.getHeight()%>px;"></div>
即在之前获得的当前活动任务对应坐标处绘制一个红色标记框。
4、程序运行效果