1.将上一篇“将JBPM4整合到web工程”项目拷贝一份
2.修改index.jsp文件至如下,在现实流程定义里面增加两个操作“启动流程,查看流程”。同时增加一个用来显示流程实例的table,并添加一个“执行”的操作。
<%@page contentType="text/html;charset=UTF-8" %><%@page import="org.jbpm.api.*" %><%@page import="java.util.*" %><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%><html> <head> <title>jBPM4学习</title> </head> <body> <form action="jbpm?zzg=deploy" method="post"> <textarea name="xml" cols=50 rows=15></textarea> <input type="submit" value="发布"/> <input type="reset" value="取消"/> </form> <table width=480 border=1> <tr><td colspan="5">流程定义</td></tr> <tr> <td>ID</td> <td>Key</td> <td>名称</td> <td>版本</td> <td>操作</td> </tr> <c:forEach var="process" items="${process}"> <tr> <td>${process.id}</td> <td>${process.key}</td> <td>${process.name}</td> <td>${process.version}</td> <td><a href="jbpm?zzg=start&key=${process.key }">启动</a> <a href="jbpm?zzg=query&id=${process.id }">查看</a> <a href="jbpm?zzg=delete&id=${process.id }">删除</a></td> </tr> </c:forEach> </table> <br> <br> <br> <table width=480 border=1> <tr><td colspan="5">流程实例</td></tr> <tr> <td>ID</td> <td>Key</td> <td>状态</td> <td>操作</td> </tr> <c:forEach var="pi" items="${pi}"> <tr> <td>${pi.id}</td> <td>${pi.key}</td> <td>${pi.state}</td> <td><a href="jbpm?zzg=run&pid=${pi.id }">执行</a></td> </tr> </c:forEach> </table> </body></html>
3.然后修改至JbpmServlet.java文件如下
package zzg;import java.io.IOException;import java.util.ArrayList;import java.util.LinkedHashMap;import java.util.List;import java.util.Map;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.jbpm.api.Configuration;import org.jbpm.api.ExecutionService;import org.jbpm.api.ProcessDefinition;import org.jbpm.api.ProcessDefinitionQuery;import org.jbpm.api.ProcessEngine;import org.jbpm.api.ProcessInstance;import org.jbpm.api.RepositoryService;public class JbpmServlet extends HttpServlet { private static final long serialVersionUID = 1L; private ProcessEngine processEngine = null; private RepositoryService repositoryService = null; private ExecutionService executionService = null; private ProcessInstance processInstance = null; /* 初始化ProcessEngine. */ public void init(ServletConfig config) throws ServletException { processEngine = new Configuration().buildProcessEngine(); repositoryService = processEngine.getRepositoryService(); executionService = processEngine.getExecutionService(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { process(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { process(request, response); } protected void process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String zzg = request.getParameter("zzg"); List<ProcessInstance> pi = null; if (zzg.equals("deploy")) { deployProcessDefinition(request, response); } else if (zzg.equals("delete")) { removeProcessDefinitionById(request, response); } else if (zzg.equals("start")) { startProcessInstance(request, response); } else if (zzg.equals("query")) { pi = getProcessInstance(request, response); request.setAttribute("pi", pi); } else if (zzg.equals("run")) { signalProcessInstance(request, response); pi = getProcessInstance(request, response); request.setAttribute("pi", pi); } List<ProcessDefinition> list = getLatestProcessDefinition(request, response); request.setAttribute("process", list); request.getRequestDispatcher("/index.jsp").forward(request, response); } /** * 发布流程方法 * * @param request * @param response * @throws ServletException * @throws IOException */ protected void deployProcessDefinition(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String xml = request.getParameter("xml"); repositoryService.createDeployment().addResourceFromString( "yy.jpdl.xml", xml).deploy(); } /* 获取最新流程. */ protected List<ProcessDefinition> getLatestProcessDefinition( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取全部的流程定义 List<ProcessDefinition> processDefinitions = repositoryService .createProcessDefinitionQuery().orderAsc( ProcessDefinitionQuery.PROPERTY_NAME).list(); Map<String, ProcessDefinition> map = new LinkedHashMap<String, ProcessDefinition>(); for (ProcessDefinition pd : processDefinitions) { String key = pd.getKey(); ProcessDefinition definition = map.get(key); if ((definition == null) || (definition.getVersion() < pd.getVersion())) { map.put(key, pd); } } return new ArrayList(map.values()); } /* 删除流程定义. */ protected void removeProcessDefinitionById(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String id = request.getParameter("id"); // 根据流程ID获取流程定义实例 ProcessDefinition pd = repositoryService.createProcessDefinitionQuery() .processDefinitionId(id).uniqueResult(); // 根据流程定义发布的ID来删除流程定义 // 注意:jbpm4是不允许直接根据流程定义的ID来直接删除流程定义的 repositoryService.deleteDeploymentCascade(pd.getDeploymentId()); } /* 根据流程定义的key值启动流程. */ protected void startProcessInstance(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String key = request.getParameter("key"); processInstance = executionService.startProcessInstanceByKey(key); } /* 根据流程定义的ID查询流程实例. */ protected List<ProcessInstance> getProcessInstance( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String pdId = request.getParameter("id"); return executionService.createProcessInstanceQuery() .processDefinitionId(pdId).list(); } /* 根据流程实例的ID执行流程实例. */ protected void signalProcessInstance(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String pid = request.getParameter("pid"); executionService.signalExecutionById(pid); }}
4.控制流程的活动主要包括以下几个:
[list]
[*]Start 启动流程
[*]End 结束流程
[*]State 流程等待
[*]Decision 决定流程流向
[*]Task 等待
[*]Fork 流程分支
[*]Join 流程汇聚
[*]Custom 操作流程
[*]Sub-process 启动一个子流程
[/list]