- <span style="font-family: Arial, Helvetica, sans-serif;">經過上一節的學習,我們已經將真整個請假流程的部署,發起以及執行分配都集成到web應用中,這裏我們要做的新工作是爲我們之前發佈的請假流程實現流程圖的跟蹤。</span>
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>
可以看到,我們是通過生成ZipInputStream對象,然後調用RepositoryService對象的相應流程部署函數完成的流程部署。
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());
2)整體流程定義圖片的顯示
- <img src="pic.jsp?id=<%=id %>" style="position:absolute;left:0px;top:0px;">
- <%@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);
- }
- %>
3)標記當前活動任務
- <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、程序運行效果