jbpm 4.4.zip4.4怎么触发jbpm 4.4.zip引擎流转到下一步transitions

博客分类:
1.新建一个动态的web项目
2.在lib目录下加入以下jar包(由于用到fileupload的上传,所以还要加入fileupload的依赖库)
引用
*JBPM4_HOME/jbpm.jar
*JBPM4_HOME/lib/*.jar
*jakarta-taglibs-standard-1.1.2_HOME/lib/jstl.jar
*jakarta-taglibs-standard-1.1.2_HOME/lib/standard.jar
*commons-fileupload-1.2.1_HOME/lib/commons-fileupload-1.2.1.jar
3.绘制流程图(在resources目录下建立一个leave.jpdl.xml文件)
&?xml version="1.0" encoding="UTF-8"?&
&process name="leave" xmlns="http://jbpm.org/4.0/jpdl"&
&start g="201,14,48,48" name="开始"&
&transition g="-42,-10" name="请假" to="填写请假单"/&
&task assignee="Kayzhan" g="178,87,92,52" name="填写请假单"&
&transition g="-97,2" name="判断是不是经理" to="是不是经理"/&
&decision expr="#{manager}" g="204,158,48,48" name="是不是经理"&
&transition g="-23,-11" name="否" to="经理审核"/&
&transition g="14,-11" name="是" to="老板审批"/&
&/decision&
&task assignee="Lingo" g="103,252,92,52" name="经理审核"&
&transition g="150,450:10,-21" name="经理批准" to="结束"/&
&transition g="-22,-22" name="请假天数&3" to="老板审批"/&
&transition g="-61,-1" name="经理不批准" to="终止"/&
&transition g="149,114:-55,82" name="经理驳回" to="填写请假单"/&
&task assignee="ForgetDavi" g="278,251,92,52" name="老板审批"&
&transition g="326,450:-58,-24" name="老板批准" to="结束"/&
&transition g="7,0" name="老板不批准" to="终止"/&
&transition g="323,114:13,61" name="老板驳回" to="填写请假单"/&
&end g="219,429,48,48" name="结束" state="confirm"/&
&end g="220,360,48,48" name="终止" state="dissent"/&
&/process&
4.编写流程发布及控制的类
import java.io.IOE
import java.lang.reflect.M
import java.util.ArrayL
import java.util.HashM
import java.util.I
import java.util.LinkedHashM
import java.util.L
import java.util.M
import java.util.S
import java.util.zip.ZipInputS
import javax.servlet.ServletC
import javax.servlet.ServletE
import javax.servlet.http.HttpS
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
import mons.fileupload.DiskFileU
import mons.fileupload.FileI
import org.jbpm.api.C
import org.jbpm.api.E
import org.jbpm.api.ExecutionS
import org.jbpm.api.ProcessD
import org.jbpm.api.ProcessDefinitionQ
import org.jbpm.api.ProcessE
import org.jbpm.api.ProcessI
import org.jbpm.api.RepositoryS
import org.jbpm.api.TaskS
import org.jbpm.api.task.T
* Servlet implementation class LeaveServlet
public class LeaveServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private ProcessEngine processEngine =
private RepositoryService repositoryService =
private ExecutionService executionService =
private ProcessInstance processInstance =
private TaskService taskService =
private Task task =
private Execution execution =
private String url =
private List list =
private List&Task& taskList =
/* 初始化ProcessEngine. */
public void init(ServletConfig config) throws ServletException {
super.init(config);
// 获取流程引擎
processEngine = new Configuration().buildProcessEngine();
repositoryService = processEngine.getRepositoryService();
executionService = processEngine.getExecutionService();
taskService = processEngine.getTaskService();
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");
if (zzg.equals("deploy")) {
deploy(request, response);
} catch (Exception e) {
e.printStackTrace();
list = getLatestProcessDefinition(request, response);
request.setAttribute("process", list);
request.getRequestDispatcher("/index.jsp").forward(request,
response);
} else if (zzg.equals("leave")) {
url = leave(request, response);
request.getRequestDispatcher(url).forward(request, response);
} else if (zzg.equals("query")) {
list = getProcessInstanceById(request, response);
request.setAttribute("pi", list);
request.getRequestDispatcher("/index.jsp").forward(request,
response);
} else if (zzg.equals("apply")) {
apply(request, response);
list = getProcessInstanceById(request, response);
request.setAttribute("pi", list);
request.getRequestDispatcher("/index.jsp").forward(request,
response);
} else if (zzg.equals("getTask")) {
list = getTask(request, response);
request.setAttribute("taskList", list);
request.getRequestDispatcher("/check.jsp").forward(request,
response);
} else if (zzg.equals("view")) {
Map&String, Object& map = view(request, response);
request.setAttribute("map", map);
request.getRequestDispatcher("/view.jsp")
.forward(request, response);
} else if (zzg.equals("confirm")) {
confirm(request, response);
list = getTask(request, response);
request.setAttribute("taskList", list);
request.getRequestDispatcher("/check.jsp").forward(request,
response);
} else if (zzg.equals("dissent")) {
dissent(request, response);
list = getTask(request, response);
request.setAttribute("taskList", list);
request.getRequestDispatcher("/check.jsp").forward(request,
response);
* try { Class clz = this.getClass(); Method method =
* clz.getDeclaredMethod(action, HttpServletRequest.class,
* HttpServletResponse.class); method.invoke(this, request, response); }
* catch (Exception ex) { ex.printStackTrace(); }
protected void deploy(HttpServletRequest request,
HttpServletResponse response) throws Exception, IOException {
String temp = getServletContext().getRealPath("/temp");
String upload = getServletContext().getRealPath("/upload");
DiskFileUpload diskFileUpload = new DiskFileUpload();
diskFileUpload.setFileSizeMax(1 * 1024 * 1024);
diskFileUpload.setSizeThreshold(4096);
diskFileUpload.setRepositoryPath(temp);
List fileItems = diskFileUpload.parseRequest(request);
Iterator iter = fileItems.iterator();
if (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
if (!item.isFormField()) {
String name = item.getName();
long size = item.getSize();
System.out.println("name: " + name + "&size:" + size);
if (name != null && !name.equals("") && size & 0) {
// Deploying a process部署流程
repositoryService.createDeployment()
.addResourcesFromZipInputStream(
new ZipInputStream(item.getInputStream()))
.deploy();
protected String leave(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 根据流程定义的KEY值启动一个新的流程实例
processInstance = executionService.startProcessInstanceByKey("leave");
//判断流程定义的活动是否是“填写请假单”的活动
if (processInstance.isActive("填写请假单")) {
url = "/apply.jsp";
protected Map&String, Object& apply(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
Map&String, Object& variables = new HashMap&String, Object&();
String name = request.getParameter("applyName");
String time = request.getParameter("applyTime");
String leaveDay = request.getParameter("leaveDay");
String content = request.getParameter("content");
String position = request.getParameter("position");
variables.put("name", name);
variables.put("time", time);
variables.put("leaveDay", leaveDay);
variables.put("content", content);
variables.put("position", position);
if (position.trim().equals("经理")) {
//"manager"变量名与leave.jpdl.xml中decision里面的变量一致,同时设置的值也要保持一致
variables.put("manager", "是");
variables.put("manager", "否");
//获取任务列表,因为我们在填写请假单的时候是分配给“zzg”的,见leave.jpdl.xml
taskList = taskService.findPersonalTasks("zzg");
//根据任务列表获取任务
task = taskList.get(0);
//把设置好的变量放到任务服务里面并根据任务ID结束任务
taskService.setVariables(task.getId(), variables);
pleteTask(task.getId());
//判断任务活动是否到达老板审批活动
execution = executionService.findExecutionById(task.getExecutionId());
System.out.println("isActive:
+ execution.getProcessInstance().isActive("老板审批"));
* 获取任务列表
* @param request
* @param response
* @throws ServletException
* @throws IOException
protected List&Task& getTask(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
taskList = taskService.findPersonalTasks(name);
return taskL
* 查看任务
* @param request
* @param response
* @throws ServletException
* @throws IOException
protected Map&String, Object& view(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String taskId = request.getParameter("id");
Set&String& set = taskService.getVariableNames(taskId);
Map&String, Object& map = taskService.getVariables(taskId, set);
protected void confirm(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String taskId = request.getParameter("id");
task = taskService.getTask(taskId);
execution = executionService.findExecutionById(task.getExecutionId());
if (execution.getProcessInstance().isActive("老板审批")) {
pleteTask(taskId, "老板批准");
} else if (execution.getProcessInstance().isActive("经理审核")) {
String variable = (String) taskService.getVariable(taskId,
"leaveDay");
if (Integer.valueOf(variable) & 3) {
pleteTask(taskId, "请假天数&3");
pleteTask(taskId, "经理批准");
protected void dissent(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String taskId = request.getParameter("id");
task = taskService.getTask(taskId);
execution = executionService.findExecutionById(task.getExecutionId());
if (execution.getProcessInstance().isActive("老板审批")) {
pleteTask(taskId, "老板不批准");
} else if (execution.getProcessInstance().isActive("经理审核")) {
pleteTask(taskId, "经理不批准");
* 获取最新版本的流程定义
* @param request
* @param response
* @throws ServletException
* @throws IOException
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());
* 根据流程定义ID获取流程实例
* @param request
* @param response
* @throws ServletException
* @throws IOException
protected List&ProcessInstance& getProcessInstanceById(
HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String pdId = request.getParameter("id");
return executionService.createProcessInstanceQuery()
.processDefinitionId(pdId).list();
5.在webapp目录下创建一个index.jsp页面,用来发布流程、显示流程定义及流程实例
&%@page contentType="text/charset=UTF-8" %&
&%@page import="org.jbpm.api.*" %&
&%@page import="java.util.*" %&
&%@ taglib prefix="c" uri="/jsp/jstl/core"%&
&title&jBPM4流程发布&/title&
&form action="leave?zzg=deploy" method="POST" enctype="multipart/form-data"&
&input type="file" name="upload"&
&input type="submit" value="发布"&
&li&&a href="leave?zzg=leave"&请假&/a&&/li&
&li&&a href="leave?zzg=getTask&name=Lingo" target="_blank"&经理的任务列表&/a&&/li&
&li&&a href="leave?zzg=getTask&name=ForgetDavi" target="_blank"&老板的任务列表&/a&&/li&
&table width=480 border=1&
&tr&&td colspan="5"&流程定义&/td&&/tr&
&td&ID&/td&
&td&Key&/td&
&td&名称&/td&
&td&版本&/td&
&td&操作&/td&
&c:forEach var="process" items="${process}"&
&td&${process.id}&/td&
&td&${process.key}&/td&
&td&${process.name}&/td&
&td&${process.version}&/td&
&td&&a href="leave?zzg=query&id=${process.id }"&查看&/a&&/td&
&/c:forEach&
&table width=480 border=1&
&tr&&td colspan="5"&流程实例&/td&&/tr&
&td&ID&/td&
&td&Key&/td&
&td&状态&/td&
&c:forEach var="pi" items="${pi}"&
&td&${pi.id}&/td&
&td&${pi.key}&/td&
&td&${pi.state}&/td&
&/c:forEach&
6.在webapp目录创建一个apply.jsp页面,用来填写请假单
&%@page contentType="text/charset=UTF-8" %&
&title&填写申请单&/title&
&form action="leave?zzg=apply" method="POST"&
&table width="300" border=1&
&td&&label&申请人&/label&&/td&
&td&&input type="text" value="zzg" name="applyName"&&/td&
&td&&label&职位&/label&&/td&
&td&&input type="text" value="经理" name="position"&&/td&
&td&&label&申请时间&/label&&/td&
&td&&input type="text" value="" name="applyTime"&&/td&
&td&&label&请假天数&/label&&/td&
&td&&input type="text" value="3" name="leaveDay"&&/td&
&td&&label&请假原因&/label&&/td&
&td&&textarea name="content" rows=3 cols=200&病假&/textarea&&/td&
&td&&input type="submit" value="申请"&&/td&
&td&&input type="reset" value="取消"&&/td&
7.在webapp目录下创建一个check.jsp文件,用来显示任务列表并添加三个操作
&%@page contentType="text/charset=UTF-8" %&
&%@page import="org.jbpm.api.*" %&
&%@page import="java.util.*" %&
&%@ taglib prefix="c" uri="/jsp/jstl/core"%&
&title&请假审批&/title&
&table width=600 border=1&
&tr&&td colspan="8"&任务列表&/td&&/tr&
&td&ID&/td&
&td&名称&/td&
&td&分配人&/td&
&td&创建时间&/td&
&td&持续时间&/td&
&td&优先级&/td&
&td&描述&/td&
&td&操作&/td&
&c:forEach var="task" items="${taskList}"&
&td&${task.id}&/td&
&td&${task.name}&/td&
&td&${task.assignee}&/td&
&td&${task.createTime}&/td&
&td&${task.duedate}&/td&
&td&${task.priority}&/td&
&td&${task.description}&/td&
&a href="leave?zzg=view&id=${task.id }" target="_blank"&审核&/a&
&a href="leave?zzg=confirm&id=${task.id }&name=${task.assignee}"&批准&/a&
&a href="leave?zzg=dissent&id=${task.id }&name=${task.assignee}"&不批准&/a&
&/c:forEach&
8.在webapp目录下创建一个view.jsp文件,用来显示请假内容
&%@page contentType="text/charset=UTF-8" %&
&%@ taglib prefix="c" uri="/jsp/jstl/core"%&
&title&审核&/title&
&table width="300" border=1&
&td&&label&申请人&/label&&/td&
&td&${map.name }&/td&
&td&&label&职位&/label&&/td&
&td&${map.position }&/td&
&td&&label&申请时间&/label&&/td&
&td&${map.time }&/td&
&td&&label&请假天数&/label&&/td&
&td&${map.leaveDay }&/td&
&td&&label&请假内容&/label&&/td&
&td&${map.content }&/td&
8.修改web.xml
&?xml version="1.0" encoding="UTF-8"?&
&web-app id="WebApp_ID" version="2.4" xmlns="/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="/xml/ns/j2ee /xml/ns/j2ee/web-app_2_4.xsd"&
&display-name&LeaveJbpm&/display-name&
&description&
&/description&
&display-name&LeaveServlet&/display-name&
&servlet-name&LeaveServlet&/servlet-name&
&servlet-class&
zzg.LeaveServlet&/servlet-class&
&/servlet&
&servlet-mapping&
&servlet-name&LeaveServlet&/servlet-name&
&url-pattern&/leave&/url-pattern&
&/servlet-mapping&
&welcome-file-list&
&welcome-file&index.jsp&/welcome-file&
&/welcome-file-list&
&/web-app&
9.把leave.jpdl.xml文件压缩成zip文件发布即可。
浏览 41443
lynnlysh 写道在研究这个例子可是在点击申请后出现 java.lang.IndexOutOfBoundsException: Index: 0, Size: 0据我所查就是taskList = taskService.findPersonalTasks("zzg");&& 这句有问题可是怎么改呀?是否是除此之外的别的问题呢?数据库中有提交过的痕迹但是状态却是“active-root”能否帮帮我呀~~~*******************忧郁的分割线****************我终于知道怎么回事了,大家在部署此项目时要将leave.jpdl.xml中的assignee="Kayzhan"改为assignee=“zzg”因为申请过程的servlet中就用的"zzg"做为申请人。由此可见,照搬项目时要动脑子啊~~~~我的改过之后,还是出现一样的问题
相关的Hibernate和JBPM配置文件呢?
我把leave.jpdl.xml压缩成ZIP部署怎么在数据库里name属性是null?
在研究这个例子可是在点击申请后出现
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
据我所查就是taskList = taskService.findPersonalTasks("zzg");&& 这句有问题
可是怎么改呀?是否是除此之外的别的问题呢?
数据库中有提交过的痕迹但是状态却是“active-root”
能否帮帮我呀~~~
*******************忧郁的分割线****************
我终于知道怎么回事了,大家在部署此项目时要将leave.jpdl.xml中的assignee="Kayzhan"改为assignee=“zzg”因为申请过程的servlet中就用的"zzg"做为申请人。
由此可见,照搬项目时要动脑子啊~~~~
& 上一页 1
浏览: 579505 次
来自: 郑州
简洁明了,支持
wkl17 写道我想知道@Override这个标识是必须的吗? ...
讲的蛮清楚的JBPM4.4工作流引擎学习(三) - xiatian_sun的博客 - CSDN博客
JBPM4.4工作流引擎学习(三)

了解jbpm的六大服务(业务与jbpm的借口,所有的对jbpm的调用都是通过这六大服务进行的)
在jBPM内部通过各种服务相互作用。服务接口可以从ProcessEngine中获得,
它是从Configuration构建的。
Configuration是jbpm的配置文件管理对象即资源加载对象.负责加载jbpm的各种配置如数据库连接配置,事务配置,身份认证,jpdl等相关配置.
ProcessEngine是一个服务工厂,有点类似hibernate的sessionFactory负责创建jbpm的每个服务.
ProcessEngine通过Configuration类构建,Configuration以单例模式获取ProcessEngine对象
ProcessEngine是线程安全的,所有的线程和请求都可以使用同一个ProcessEngine对象
获取流程引擎:
ProcessEngineprocessEngine = Configuration.getProcessEngine();
该方法会直接加载classpath下名为jbpm.cfg.xml的配置文件,通过该配置文件中的生命去构建引擎
RepositoryService
流程资源服务接口。提供对流程定义的部署、查询、删除和流程图查看等操作。
ExecutionService
流程执行服务接口,提供启动流程实例,“执行”推进,设置流程变量等操作。
TaskService
人工任务服务接口。提供对任务的创建、提交、查询、保存、删除等操作。
HistoryService
流程历史服务接口。提供对任务的管理操作。提供对流程历史库中历史流程实例、历史活动实例等记录的查询。
ManagementService
流程管理接口,通常用来管理Jop(异步服务)
IdentityService
身份认证服务接口。提供对流程用户、用户组管理
我的热门文章jBPM4.4之Transition和Decision - CN.programmer.Luxh - 博客园
太白枝头看,花开不计年,杯中浮日月,楼外是青天。
posts - 191, comments - 230, trackbacks - 0, articles - 0
一、transition
  transition: 流转。
  通过transition把流程的各个活动连接起来。
1、关于transition
  1)start活动只能有一个transition
  2)end活动没有transition
  3)其他活动可以有一条或多条transition
  4)如果某个活动只有一个transition,可以不指定transition的名称;如果某个活动有多个transition,需要分别指定唯一的名称
2、使用transition
  如果某个活动有多个transition,在处理完成任务时,需要手工指定下一步的transition。
  1)先看一下报销的流程
  1.1)流程图
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&
  1.2)定义文件
&?xml version="1.0" encoding="UTF-8"?&
&process name="Reimbursement" xmlns="http://jbpm.org/4.4/jpdl"&
&start name="start1" g="110,16,48,48"&
&transition name="to 提交报销单" to="提交报销单" g="-79,-20"/&
&end name="end1" g="110,393,48,48"/&
&task name="提交报销单" g="88,96,92,52" assignee="员工A"&
&transition name="to 部门经理审批" to="部门经理审批" g="-91,-20"/&
&task name="部门经理审批" g="88,180,92,52" assignee="部门经理B"&
&transition name="to 总经理审批" to="总经理审批" g="-38,-8"/&
&transition name="to 财务拨款" to="财务拨款" g="-67,-20"/&
&task name="总经理审批" g="271,264,92,52" assignee="总经理C"&
&transition name="to 财务拨款" to="财务拨款" g="-34,-10"/&
&task name="财务拨款" g="86,299,92,52" assignee="财务D"&
&transition name="to end1" to="end1" g="-45,-20"/&
&/process&
  2)手工指定下一步的transition
  在部门经理审批节点,有两个transition,在部门经理B审批完成后,需要指定下一步的transition。
  2.1)没有指定transition
//处理待办
public void testCompleteTask() {
String userId = "部门经理B";
List&Task& tasks = processEngine.getTaskService().findPersonalTasks(userId);
for(Task task : tasks) {
processEngine.getTaskService().completeTask(task.getId());//没有指定transition
  上面的代码在完成任务的时候没有指定transition,会报错:org.jbpm.api.JbpmException: No unnamed transitions were found for the task '部门经理审批'。
  2.2)完成任务时指定transition
//处理待办
public void testCompleteTask() {
String userId = "部门经理B";
List&Task& tasks = processEngine.getTaskService().findPersonalTasks(userId);
for(Task task : tasks) {
String transition = "to 总经理审批";
//String transition = "to 财务拨款";
processEngine.getTaskService().completeTask(userId, transition);//指定transition
  比如当报销金额&=5000元时,指定下一步是总经理审批;当报销金额&5000元时,指定下一步是财务拨款。
3、在实际使用中,会在页面上把下一步的transition列出来,让用户选择流转。
二、decision
  decision:决定性判断。
  根据条件自动在多个流转路径中选择其一通过。
  decision可以有多个流出转移,当流程实例到达decision活动时,会根据最先匹配成功的一个条件通过相应的流出转移。
  decision和transition的区别是:decision根据条件自动选择转移路径,只使用transition则需要手工指定转移路径。
1、看一下使用decision的报销流程
  1)流程定义图
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
  2)流程定义文件
&?xml version="1.0" encoding="UTF-8"?&
&process name="Reimbursement" xmlns="http://jbpm.org/4.4/jpdl"&
&start name="start1" g="110,16,48,48"&
&transition name="to 提交报销单" to="提交报销单" g="-79,-20"/&
&end name="end1" g="117,439,48,48"/&
&task name="提交报销单" g="88,96,92,52" assignee="员工A"&
&transition name="to 部门经理审批" to="部门经理审批" g="-91,-20"/&
&task name="部门经理审批" g="88,180,92,52" assignee="部门经理B"&
&transition name="to exclusive1" to="exclusive1" g="-70,-11"/&
&decision name="exclusive1" g="110,264,48,48"&
&handler class="cn.luxh.jbpm4.handler.MoneyDecisionHander" /&
&transition name="to 财务拨款" to="财务拨款" g="-67,-20"/&
&transition name="to 总经理审批" to="总经理审批" g="-34,-18"/&
&/decision&
&task name="财务拨款" g="92,362,92,44" assignee="财务D"&
&transition name="to end1" to="end1" g="-45,-20"/&
&task name="总经理审批" g="240,301,92,52" assignee="总经理C"&
&transition name="to 财务拨款" to="财务拨款" g="-42,-20"/&
&/process&
  在decision活动处加了一个MoneyDecisionHandler处理类去自动判断金额。
2、MoneyDecisionHandler处理类
  MoneyDecisionHandler处理类需要实现DecisionHandler接口。
package cn.luxh.jbpm4.
import org.jbpm.api.jpdl.DecisionH
import org.jbpm.api.model.OpenE
* 金额判断
* @author Luxh
public class MoneyDecisionHander implements DecisionHandler {
public String decide(OpenExecution execution) {
System.out.println("执行金额判断handler");
//从流程变量中获取提交报销单时的报销金额
int money = (Integer) execution.getVariable("money");
if(money&=5000) {
return "to 总经理审批";
return "to 财务拨款";
3、在提交申请单时,把报销金额存到流程变量中
public void testCompleteTask() {
String userId = "员工A";
List&Task& tasks = processEngine.getTaskService().findPersonalTasks(userId);
System.out.println("tasks.size---"+tasks.size());
for(Task task : tasks) {
Map&String,Integer& variables = new HashMap&String, Integer&();
variables.put("money", 6000);
//提交报销单时把报销金额存到流程变量中
processEngine.getTaskService().setVariables(task.getId(), variables);
processEngine.getTaskService().completeTask(task.getId());}

我要回帖

更多关于 jbpm4.4 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信