将JBPM4整合到web工程---流程实例管理

本文介绍了如何在Web项目中整合JBPM4流程引擎,并详细展示了如何通过修改index.jsp文件来实现流程定义的操作如启动、查看及流程实例的展示。此外,还提供了JbpmServlet.java的具体代码实现。
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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值