转载自http://blog.csdn.net/huangjingqian/article/details/7344218
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.控制流程的活动主要包括以下几个:
- Start 启动流程
- End 结束流程
- State 流程等待
- Decision 决定流程流向
- Task 等待
- Fork 流程分支
- Join 流程汇聚
- Custom 操作流程
- Sub-process 启动一个子流程