`
longgangbai
  • 浏览: 7337975 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

工作流Activiti的学习总结(八)Activiti自动执行的应用

阅读更多

  工作流activiti自动执行任务的开发应用 

工作流模拟某公司请假流程情景如下:
   1.开发人员请假流程,如果开发人员请假,如果请假天数小于3天,组长批准,人事批准即可请假。
   2.如果请假大约三天,需要项目经理或者产品经理批准,并且项目总监批准
   
 模拟自动审批:

    只需要启动一个流程实例,它会自动执行到结束。这种情况下,你不需要关注流
   程的执行进度,而只需要把精力集中在每个结点的处理逻辑(通常是简单或者复杂的商业逻辑)上。

 

流程设计图如下:

 

 

 

 

流程配置文件AutoExecuteTask.bpmn20.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
 <process id="AutoExecuteTask" name="AutoExecuteTask">
    <startEvent id="startevent1" name="Start"></startEvent>
    <parallelGateway id="parallelgateway1" name="多种请假方式"></parallelGateway>
    <serviceTask id="servicetask1" name="项目经理同意" activiti:class="com.easyway.workflow.activiti.gateway.DeveloperManagerServiceTask"></serviceTask>
    <serviceTask id="servicetask2" name="产品经理同意" activiti:class="com.easyway.workflow.activiti.gateway.ProductManagerServiceTask"></serviceTask>
    <serviceTask id="servicetask3" name="项目组长同意" activiti:class="com.easyway.workflow.activiti.gateway.TeamLeaderServiceTask"></serviceTask>
    <parallelGateway id="parallelgateway2" name="First Join"></parallelGateway>
    <serviceTask id="servicetask4" name="项目总监同意" activiti:class="com.easyway.workflow.activiti.gateway.ProductBossServiceTask"></serviceTask>
    <parallelGateway id="parallelgateway3" name="人事判断"></parallelGateway>
    <serviceTask id="servicetask5" name="人事部门同意" activiti:class="com.easyway.workflow.activiti.gateway.HumanResouceServiceTask"></serviceTask>
    <endEvent id="endevent1" name="End"></endEvent>
    <sequenceFlow id="flow1" name="" sourceRef="startevent1" targetRef="parallelgateway1"></sequenceFlow>
    <sequenceFlow id="flow2" name="" sourceRef="parallelgateway1" targetRef="servicetask1"></sequenceFlow>
    <sequenceFlow id="flow3" name="" sourceRef="parallelgateway1" targetRef="servicetask2"></sequenceFlow>
    <sequenceFlow id="flow4" name="" sourceRef="parallelgateway1" targetRef="servicetask3"></sequenceFlow>
    <sequenceFlow id="flow5" name="" sourceRef="servicetask1" targetRef="parallelgateway2"></sequenceFlow>
    <sequenceFlow id="flow6" name="" sourceRef="servicetask2" targetRef="parallelgateway2"></sequenceFlow>
    <sequenceFlow id="flow7" name="" sourceRef="servicetask3" targetRef="parallelgateway3"></sequenceFlow>
    <sequenceFlow id="flow8" name="" sourceRef="parallelgateway2" targetRef="servicetask4"></sequenceFlow>
    <sequenceFlow id="flow9" name="" sourceRef="servicetask4" targetRef="parallelgateway3"></sequenceFlow>
    <sequenceFlow id="flow10" name="" sourceRef="parallelgateway3" targetRef="servicetask5"></sequenceFlow>
    <sequenceFlow id="flow11" name="" sourceRef="servicetask5" targetRef="endevent1"></sequenceFlow>
  </process>
  
  
</definitions>

 

 

 

 

 

 

package com.easyway.workflow.activiti.gateway;


import java.util.logging.Logger;
/**
 * execute方法的参数DelegateExecution execution可以在流程中各个结点之间传递流程变量。 
 *通过基于Activiti 5.6的<parallelGateway>、<serviceTask>、<receiveTask>、<userTask>元素。
 *
 *自动执行 
<serviceTask>元素,可以实现自动活动,语法如下所示: 
<serviceTask id="serviceTaskId" name="serviceTaskName" 
activiti:class="org.shirdrn.workflow.activiti.gateway.ServiceTaskClass"/> 
其中,activiti:class属性为该结点对应的处理类,该类要求实现org.activiti.engine.delegate.JavaDelegate接口
 *
 * <serviceTask id="servicetask1" name="项目经理同意" activiti:class="com.easyway.workflow.activiti.gateway.DeveloperManagerServiceTask"></serviceTask>
    
 * 项目经理审批过程
 * @author longgangbai
 * 
 * 
 * 2011-12-17  下午07:45:47
 */
public class DeveloperManagerServiceTask implements JavaDelegate {

	private final Logger log = Logger.getLogger(DeveloperManagerServiceTask.class.getName());

	@Override
	public void execute(DelegateExecution execution) throws Exception {
		Thread.sleep(10000);
		log.info("variavles=" + execution.getVariables());
		execution.setVariable("项目经理", "请假天数大约3天,同意请假。");
		log.info("项目经理,请假天数大约3天,同意请假。.");		
	}
}

 

 

 

package com.easyway.workflow.activiti.gateway;


import java.util.logging.Logger;
/**
  * execute方法的参数DelegateExecution execution可以在流程中各个结点之间传递流程变量。 
 *
 *
 * <serviceTask id="servicetask2" name="产品经理同意" activiti:class="com.easyway.workflow.activiti.gateway.ProductManagerServiceTask"></serviceTask>
   
 * 产品经理审批过程
 * @author longgangbai
 * 
 * 2011-12-17  下午07:45:47
 */
public class ProductManagerServiceTask implements JavaDelegate {

	private final Logger log = Logger.getLogger(ProductManagerServiceTask.class.getName());

	@Override
	public void execute(DelegateExecution execution) throws Exception {
		Thread.sleep(10000);
		log.info("variavles=" + execution.getVariables());
		execution.setVariable("产品经理", "请假天数大约3天,同意请假。");
		log.info("产品经理,请假天数大约3天,同意请假。");			
	}
}

 

 

package com.easyway.workflow.activiti.gateway;


import java.util.logging.Logger;
/**
 * 项目组长批准请假
 *    模拟当开发人员请假小于3天,组长比准
 *    
 *    
 *     <serviceTask id="servicetask3" name="项目组长同意" activiti:class="com.easyway.workflow.activiti.gateway.TeamLeaderServiceTask"></serviceTask>
   
 * @author longgangbai
 * 
 * 2011-12-17  上午09:07:37
 */
public class TeamLeaderServiceTask implements JavaDelegate {

	private final Logger log = Logger.getLogger(TeamLeaderServiceTask.class.getName());

	@Override
	public void execute(DelegateExecution execution) throws Exception {
		Thread.sleep(10000);
		log.info("variavles=" + execution.getVariables());
		execution.setVariable("项目组长", "请假天数小于3天,同意请假。");
		log.info("项目组长,请假天数小于3天,同意请假。");
	}
}

 

 

 

package com.easyway.workflow.activiti.gateway;


import java.util.logging.Logger;
/**
 *  execute方法的参数DelegateExecution execution可以在流程中各个结点之间传递流程变量。 
 *
 * <serviceTask id="servicetask4" name="项目总监同意" activiti:class="com.easyway.workflow.activiti.gateway.ProductBossServiceTask"></serviceTask>
 *
 * 项目总监审批过程
 * @author longgangbai
 * 
 * 2011-12-17  下午07:45:47
 */
public class ProductBossServiceTask implements JavaDelegate {

	private final Logger log = Logger.getLogger(ProductBossServiceTask.class.getName());

	@Override
	public void execute(DelegateExecution execution) throws Exception {
		Thread.sleep(10000);
		log.info("variavles=" + execution.getVariables());
		execution.setVariable("项目总监", "请假天数大约3天,同意请假。");
		log.info("项目总监,请假天数大约3天,同意请假。");		
	}
}

 

 

package com.easyway.workflow.activiti.gateway;


import java.util.logging.Logger;
/**
  * execute方法的参数DelegateExecution execution可以在流程中各个结点之间传递流程变量。 
 *自动执行 
<serviceTask>元素,可以实现自动活动,语法如下所示: 
<serviceTask id="serviceTaskId" name="serviceTaskName" 
activiti:class="org.shirdrn.workflow.activiti.gateway.ServiceTaskClass"/> 
其中,activiti:class属性为该结点对应的处理类,该类要求实现org.activiti.engine.delegate.JavaDelegate接口

 *  <serviceTask id="servicetask5" name="人事部门同意" activiti:class="com.easyway.workflow.activiti.gateway.HumanResouceServiceTask"></serviceTask>
 *
 * 人事部门审批过程
 * @author longgangbai
 * 
 * 2011-12-17  下午07:45:47
 */
public class HumanResouceServiceTask implements JavaDelegate {

	private final Logger log = Logger.getLogger(HumanResouceServiceTask.class.getName());

	@Override
	public void execute(DelegateExecution execution) throws Exception {
		Thread.sleep(10000);
		log.info("variavles=" + execution.getVariables());
		execution.setVariable("人事部门", "请假天数大约3天,同意请假。");
		log.info("人事部门 ,请假天数大约3天,同意请假。");
	}
}

 

 

package com.easyway.workflow.activiti.gateway;


import junit.framework.TestCase;

import org.activiti.engine.FormService;
import org.activiti.engine.HistoryService;
import org.activiti.engine.IdentityService;
import org.activiti.engine.ManagementService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.test.ActivitiTestCase;
/**
 * 主要是在测试之前做一些初始化工作,主要包括流程引擎实例
 * 的构建,及其流程提供的基本服务。
 * 目的:让开发者熟悉工作流使用过程使用的几个步骤
 * 1.加载相关的工作流全局配置文件activiti.cfg.xml配置文件信息
 * 2.获取工作流相关的服务(RepositoryService,RuntimeService,
 *    TaskService,HistoryService,FormService,ManagementService,
 *    IdentityService等)
 * 2.加载工作流文件*.bpmn20.xml信息
 * 
 * 3.部署工作流
 *    部署工作流由多种方式,在以后会相继讲解
 * 
 * @author longgangbai
 * 
 * 2011-12-17  下午07:48:59
 */
public abstract class AbstractTest extends TestCase {

	private ProcessEngine processEngine;
	protected String deploymentId;
	protected RepositoryService repositoryService;
	protected RuntimeService runtimeService;
	protected TaskService taskService;
	protected FormService formService;
	protected HistoryService historyService;
	protected IdentityService identityService;
	protected ManagementService managementService;
	
	
	/**
	 * 测试用例开始初始化工作
	 * 1.创建相关的工作流程对象ProcessEngine
	 * 2.创建相关的服务
	 * 3.
	 */
	@Override
	protected void setUp() throws Exception {
		super.setUp();
		//由于ProcessEngine为线程安全性对象,整个项目可以共用一个
		if(processEngine==null) {
			//此处使用此种方法调用的activiti的配置文件为 classpath路径下的activiti.cfg.xml
			//采用的H2的数据库
			processEngine = ProcessEngines.getDefaultProcessEngine();
		}
		//获取工作流的各种服务信息
		repositoryService = processEngine.getRepositoryService();
		runtimeService = processEngine.getRuntimeService();
		taskService = processEngine.getTaskService();
		formService = processEngine.getFormService();
		historyService = processEngine.getHistoryService();
		identityService = processEngine.getIdentityService();
		managementService = processEngine.getManagementService();
		//调用扩展的初始化工作
		initialize();
		
	}
	
	/**
	 * test销毁方法
	 */
	@Override
	protected void tearDown() throws Exception {
		super.tearDown();
		destroy();
	}
	
	/**
	 * 便于子类的工作的初始化的扩展工作
	 * 
	 * 
	 * @throws Exception
	 */
	protected abstract void initialize() throws Exception;
	/**
	 * 便于子类的工作的销毁的扩展工作
	 * 
	 * @throws Exception
	 */
	protected abstract void destroy() throws Exception;
}

 

 

package com.easyway.workflow.activiti.gateway;


import org.activiti.engine.runtime.ProcessInstance;


/**
 * Activiti 5.6支持流程活动自动执行与手工触发执行。
 * 其中,自动执行是指,在启动流程之前,准备流程所需要的控制流程进度的变量数据,
 * 启动流程之后,无需外部干预,就能够按照预定义的流程执行;
 * 过基于Activiti 5.6的<parallelGateway>、<serviceTask>、<receiveTask>、<userTask>元素
 * 
 * 
 * 自动执行 
 *<serviceTask>元素,可以实现自动活动,语法如下所示: 
 *<serviceTask id="serviceTaskId" name="serviceTaskName" 
 *activiti:class="org.shirdrn.workflow.activiti.gateway.ServiceTaskClass"/> 
 *
 * 其中,activiti:class属性为该结点对应的处理类,该类要求实现org.activiti.engine.delegate.JavaDelegate
 * 接口,该接口定义如下所示: 
 * 
 * <pre>
 * package org.activiti.engine.delegate;
 *   public interface JavaDelegate {
 *         void execute(DelegateExecution execution) throws Exception;
 *  }
 * </pre>
 * execute方法的参数DelegateExecution execution可以在流程中各个结点之间传递流程变量
 * 
 * 工作流模拟某公司请假流程情景如下:
 *  1.开发人员请假流程,如果开发人员请假,如果请假天数小于3天,组长批准,人事批准即可请假。
 *  2.如果请假大约三天,需要项目经理或者产品经理批准,并且项目总监批准
 *  
 *  模拟自动审批:只需要启动一个流程实例,它会自动执行到结束。这种情况下,你不需要关注流
 *  程的执行进度,而只需要把精力集中在每个结点的处理逻辑(通常是简单或者复杂的商业逻辑)上。
 * 
 *  
 * 
 * @author longgangbai
 * 
 * 2011-12-17  08:01:55
 */
public class AutomaticParallelGatewayTest extends AbstractTest {

	private String deploymentId;
	
	@Override
	protected void initialize() throws Exception {
		deploymentId = repositoryService.createDeployment()
			.addClasspathResource("diagrams/AutoExecuteTask.bpmn20.xml")
			.deploy().getId();
	}

	@Override
	protected void destroy() throws Exception {
		repositoryService.deleteDeployment(deploymentId, true);
	}
	
	/**
	 * 使用注解部署 工作流程
	 */
	@Deployment
	public void testForkJoin() {
		//根据流程ID获取流程实例
		ProcessInstance pi = runtimeService.startProcessInstanceByKey("AutoExecuteTask");
		//根据运行是服务检查是否执行的结束
		assertEquals(true, pi.isEnded());
	}
}

 

 

 运行结果如下(运行单元测试之前必须启动H2数据库,否则报错):

2011-12-18 12:50:13 org.activiti.engine.ProcessEngines initProcessEnginFromResource
信息: initializing process engine for resource jar:file:/C:/activiti-rest/activiti-cfg.jar!/activiti.cfg.xml
2011-12-18 12:50:17 org.activiti.engine.impl.ProcessEngineImpl <init>
信息: ProcessEngine default created
2011-12-18 12:50:17 org.activiti.engine.ProcessEngines initProcessEnginFromResource
信息: initialised process engine default
2011-12-18 12:50:17 org.activiti.engine.impl.jobexecutor.JobAcquisitionThread run
信息: JobAcquisitionThread starting to acquire jobs
2011-12-18 12:50:17 org.activiti.engine.impl.bpmn.deployer.BpmnDeployer deploy
信息: Processing resource diagrams/AutoExecuteTask.bpmn20.xml
2011-12-18 12:50:17 org.activiti.engine.impl.bpmn.parser.BpmnParse parseDefinitionsAttributes
信息: XMLSchema currently not supported as typeLanguage
2011-12-18 12:50:17 org.activiti.engine.impl.bpmn.parser.BpmnParse parseDefinitionsAttributes
信息: XPath currently not supported as expressionLanguage
2011-12-18 12:50:27 com.easyway.workflow.activiti.gateway.DeveloperManagerServiceTask execute
信息: variavles={}
2011-12-18 12:50:27 com.easyway.workflow.activiti.gateway.DeveloperManagerServiceTask execute
信息: 项目经理,请假天数大约3天,同意请假。.
2011-12-18 12:50:37 com.easyway.workflow.activiti.gateway.ProductManagerServiceTask execute
信息: variavles={项目经理=请假天数大约3天,同意请假。}
2011-12-18 12:50:37 com.easyway.workflow.activiti.gateway.ProductManagerServiceTask execute
信息: 产品经理,请假天数大约3天,同意请假。
2011-12-18 12:50:47 com.easyway.workflow.activiti.gateway.ProductBossServiceTask execute
信息: variavles={项目经理=请假天数大约3天,同意请假。, 产品经理=请假天数大约3天,同意请假。}
2011-12-18 12:50:47 com.easyway.workflow.activiti.gateway.ProductBossServiceTask execute
信息: 项目总监,请假天数大约3天,同意请假。
2011-12-18 12:50:57 com.easyway.workflow.activiti.gateway.TeamLeaderServiceTask execute
信息: variavles={项目总监=请假天数大约3天,同意请假。, 项目经理=请假天数大约3天,同意请假。, 产品经理=请假天数大约3天,同意请假。}
2011-12-18 12:50:57 com.easyway.workflow.activiti.gateway.TeamLeaderServiceTask execute
信息: 项目组长,请假天数小于3天,同意请假。
2011-12-18 12:51:08 com.easyway.workflow.activiti.gateway.HumanResouceServiceTask execute
信息: variavles={项目总监=请假天数大约3天,同意请假。, 项目组长=请假天数小于3天,同意请假。, 项目经理=请假天数大约3天,同意请假。, 产品经理=请假天数大约3天,同意请假。}
2011-12-18 12:51:08 com.easyway.workflow.activiti.gateway.HumanResouceServiceTask execute
信息: 人事部门 ,请假天数大约3天,同意请假。

 由上面运行结果可以看出:

  1.XPath currently not supported as expressionLanguage:原因工作流activiti表达式UEL必须在JDK1.5+以上,其实是UEL在JDK1.6中提供,本人采用JDK1.5.

  2.:/C:/activiti-rest/activiti-cfg.jar!/activiti.cfg.xml:全局activiti配置文件采用默认的配置文件。

 

 

 

分享到:
评论
15 楼 ln94223 2018-02-02  
第一个应该用排它网关吧 怎么是并行网关, 并行网关是所有execution都要通过
14 楼 di1984HIT 2017-03-13  
雪鞋了~~~  
13 楼 javaeyetodj 2016-03-13  
大神你好,请教个问题 serviceTask和userTask有区别呢 ?
12 楼 loyin 2015-05-22  
请教个问题,由于我的流程里全部是servicetask 但我的各个servicetask对应的业务处理是需要做出流程实例暂停的操作。但是在execute 方法中调用runtimeService.suspendProcessInstanceById(processInstanceId); 为什么报找不到这个流程实例id?请问改如何解决。一直困恼我很久。
11 楼 he3109006290 2014-07-06  
感觉需求不应该是并行网关
10 楼 longgangbai 2013-09-21  
zhchx0827 写道
为什么都是同意,如果有某一级节点不同意,怎么处理呢?

不同意直接结束呀,可能当时做demo没有详细说明.
9 楼 zhchx0827 2013-09-16  
为什么都是同意,如果有某一级节点不同意,怎么处理呢?
8 楼 longgangbai 2013-08-26  
dmt198704 写道
你好,执行的顺序为什么不是项目经理-》产品经理-》项目组长-》项目总监-》人事部门同意呢?

这个是你自己可以控制的,自己修改一下顺序即可.
7 楼 dmt198704 2013-08-25  
你好,执行的顺序为什么不是项目经理-》产品经理-》项目组长-》项目总监-》人事部门同意呢?
6 楼 longgangbai 2012-08-28  
activiti.cfg.xml
aulindoncool 写道
你好,我照你的过程建了工程,在运行测试的时候报
processEngine = ProcessEngines.getDefaultProcessEngine();  这一行空指针溢出,我查询了下我的xml文件里面的ID是无误的,请问是什么原因呢,麻烦答复,感激不尽

这个是因为你的classpath路径下的activiti.cfg.xml不存在导致的,可以拷贝该文件到/src/main/resources包下

你们遇到问题一样,你按照我的作法测试了吗?

注意事项如下:
1.部署工作流控制台
2.部署工作流(上传工作流文件)
3.部署过程基本应该就好了


你的工作流中数据库有这个id吗?
5 楼 aulindoncool 2012-08-28  
你好,我照你的过程建了工程,在运行测试的时候报
processEngine = ProcessEngines.getDefaultProcessEngine();  这一行空指针溢出,我查询了下我的xml文件里面的ID是无误的,请问是什么原因呢,麻烦答复,感激不尽

这个是因为你的classpath路径下的activiti.cfg.xml不存在导致的,可以拷贝该文件到/src/main/resources包下
4 楼 longgangbai 2012-08-22  
zqq65605344 写道
你好,我照你的过程建了工程,在运行测试的时候报
processEngine = ProcessEngines.getDefaultProcessEngine();  这一行空指针溢出,我查询了下我的xml文件里面的ID是无误的,请问是什么原因呢,麻烦答复,感激不尽

注意事项如下:
1.部署工作流控制台
2.部署工作流(上传工作流文件)
3.部署过程基本应该就好了
3 楼 zqq65605344 2012-08-21  
你好,我照你的过程建了工程,在运行测试的时候报
processEngine = ProcessEngines.getDefaultProcessEngine();  这一行空指针溢出,我查询了下我的xml文件里面的ID是无误的,请问是什么原因呢,麻烦答复,感激不尽
2 楼 longgangbai 2012-06-06  
“true”,
dashamo 写道
你好,请教你一个问题,我是刚学activiti的
activiti下载包里有一个工程activiti-engine-examples
我拿 VacationRequest.bpmn20.xml 这个请假流程作为一个学习例子。假期申请人A提交一个开始节点的表单(request.form)时没有问题,这时启动一个流程实例,并给相关人员B生成一个代理任务,这也没问题,但当相应人员B处理该代理任务也就是处理A的请假请求时,他提交他的任务表单approve.form  ,后台代码如下

String taskId = request.getParameter("taskId");
String vacationApproved = request.getParameter("vacationApproved");
String managerMotivation = request.getParameter("managerMotivation");

Map<String, String> formProperties = new HashMap<String, String>();
formProperties.put("vacationApproved_type", vacationApproved_type);
formProperties.put("vacationApproved", vacationApproved);
formProperties.put("managerMotivation", managerMotivation);
formService.submitTaskFormData(taskId, formProperties);

这时最后一句话 formService.submitTaskFormData(taskId, formProperties);报错误,错误如下:
严重: Error while closing command context
org.activiti.engine.ActivitiException: condition expression returns non-Boolean: true (java.lang.String)
at org.activiti.engine.impl.el.UelExpressionCondition.evaluate(UelExpressionCondition.java:43)
at org.activiti.engine.impl.bpmn.behavior.ExclusiveGatewayActivityBehavior.leave(ExclusiveGatewayActivityBehavior.java:63)
at org.activiti.engine.impl.bpmn.behavior.FlowNodeActivityBehavior.execute(FlowNodeActivityBehavior.java:36)
at org.activiti.engine.impl.pvm.runtime.AtomicOperationActivityExecute.execute(AtomicOperationActivityExecute.java:44)
at org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:76)
at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:497)

意思是表达式返回的不是布尔值,确实不是布尔值,
在 approve.form 中vacationApproved确实要求是boolean类型的
  <select name="vacationApproved">
    <option value="true">Yes</option>
    <option value="false">No</option>
   </select>
   <input type="hidden" name="vacationApproved_type" value="Boolean" />
我传递到后台的
String vacationApproved = request.getParameter("vacationApproved");
vacationApproved 是字符串 “true”,
可是流程文件中审批请假的这个用户任务后的这个分支节点的输入条件要求的表达式是
${vacationApproved}
流程文件片段如下
    <sequenceFlow id="flow3" sourceRef="requestApprovedDecision" targetRef="sendApprovalMail">
      <conditionExpression xsi:type="tFormalExpression">${vacationApproved}</conditionExpression>
    </sequenceFlow>

看意思是要求vacationApproved是布尔类型的,可这个变量
是请假审批人提交表单的一个数据,这个数据只能是字符串型的,因为
formService 这个服务类提交用户任务表单的方法是
void submitTaskFormData(String taskId, Map<String, String>
properties);

只能传递字符串。


现在的问题就是我传递字符串过去后台报错说 返回值是字符串“true”,不是boolean 类型的,可是我也不能直接传递一个boolean 类型的过去呀,因为api 不允许。

怎么办?
请教了!


你页面下拉框获取的"true"为字符串需要你转换为boolean值,明白吗?
1 楼 dashamo 2012-06-04  
你好,请教你一个问题,我是刚学activiti的
activiti下载包里有一个工程activiti-engine-examples
我拿 VacationRequest.bpmn20.xml 这个请假流程作为一个学习例子。假期申请人A提交一个开始节点的表单(request.form)时没有问题,这时启动一个流程实例,并给相关人员B生成一个代理任务,这也没问题,但当相应人员B处理该代理任务也就是处理A的请假请求时,他提交他的任务表单approve.form  ,后台代码如下

String taskId = request.getParameter("taskId");
String vacationApproved = request.getParameter("vacationApproved");
String managerMotivation = request.getParameter("managerMotivation");

Map<String, String> formProperties = new HashMap<String, String>();
formProperties.put("vacationApproved_type", vacationApproved_type);
formProperties.put("vacationApproved", vacationApproved);
formProperties.put("managerMotivation", managerMotivation);
formService.submitTaskFormData(taskId, formProperties);

这时最后一句话 formService.submitTaskFormData(taskId, formProperties);报错误,错误如下:
严重: Error while closing command context
org.activiti.engine.ActivitiException: condition expression returns non-Boolean: true (java.lang.String)
at org.activiti.engine.impl.el.UelExpressionCondition.evaluate(UelExpressionCondition.java:43)
at org.activiti.engine.impl.bpmn.behavior.ExclusiveGatewayActivityBehavior.leave(ExclusiveGatewayActivityBehavior.java:63)
at org.activiti.engine.impl.bpmn.behavior.FlowNodeActivityBehavior.execute(FlowNodeActivityBehavior.java:36)
at org.activiti.engine.impl.pvm.runtime.AtomicOperationActivityExecute.execute(AtomicOperationActivityExecute.java:44)
at org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:76)
at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:497)

意思是表达式返回的不是布尔值,确实不是布尔值,
在 approve.form 中vacationApproved确实要求是boolean类型的
  <select name="vacationApproved">
    <option value="true">Yes</option>
    <option value="false">No</option>
   </select>
   <input type="hidden" name="vacationApproved_type" value="Boolean" />
我传递到后台的
String vacationApproved = request.getParameter("vacationApproved");
vacationApproved 是字符串 “true”,
可是流程文件中审批请假的这个用户任务后的这个分支节点的输入条件要求的表达式是
${vacationApproved}
流程文件片段如下
    <sequenceFlow id="flow3" sourceRef="requestApprovedDecision" targetRef="sendApprovalMail">
      <conditionExpression xsi:type="tFormalExpression">${vacationApproved}</conditionExpression>
    </sequenceFlow>

看意思是要求vacationApproved是布尔类型的,可这个变量
是请假审批人提交表单的一个数据,这个数据只能是字符串型的,因为
formService 这个服务类提交用户任务表单的方法是
void submitTaskFormData(String taskId, Map<String, String>
properties);

只能传递字符串。


现在的问题就是我传递字符串过去后台报错说 返回值是字符串“true”,不是boolean 类型的,可是我也不能直接传递一个boolean 类型的过去呀,因为api 不允许。

怎么办?
请教了!

相关推荐

    工作流Activiti5学习总结

    【工作流Activiti5学习总结】 工作流管理系统(Workflow Management System, WfMS)是企业信息化建设中的重要组成部分,它负责协调和管理业务流程。Activiti5是一款开源的工作流引擎,由Alfresco公司开发,它基于...

    工作流activiti学习代码

    工作流Activiti是一种开源的工作流引擎,用于在企业应用程序中实现业务流程自动化。它由Alfresco Software开发,旨在提供灵活、可扩展且易于使用的流程管理解决方案。在本"工作流Activiti学习代码"资源中,我们将...

    工作流Activiti的学习总结(十二) activiti官方十分钟快速学习

    在本篇博客“工作流Activiti的学习总结(十二)activiti官方十分钟快速学习”中,作者分享了关于Activiti工作流引擎的快速学习经验。Activiti是一个开源的、基于Java的企业级工作流引擎,它被广泛应用于自动化业务...

    activiti工作流PPT

    **正文** ...总结来说,了解并熟练掌握Activiti的常用API对于任何希望实现高效工作流管理的开发者都至关重要。通过学习这个PPT,你将能够更好地理解和应用Activiti,从而提升你的业务流程自动化能力。

    工作流Activiti的学习总结(九)Activiti手工执行的应用(ReceiveTask实现方式)

    在本篇博文中,我们将深入探讨Activiti工作流引擎中手工执行的应用,特别是通过ReceiveTask实现方式。Activiti是一款开源的业务流程管理(BPM)和工作流引擎,广泛应用于企业的流程自动化。它允许开发者定义复杂的...

    activiti工作流学习总结

    总的来说,这篇“activiti工作流学习总结”旨在帮助读者全面掌握Activiti的工作流程、设计方法以及实际操作技巧,对于希望在企业级应用中实施工作流管理的开发者具有很高的参考价值。通过深入学习和实践,不仅可以...

    Activiti工作流示例Activiti Demo(带完整源码)非常实用

    Activiti是一款开源的工作流引擎,它基于模型驱动的架构(MDA),专为现代企业应用程序设计,用于处理业务流程自动化。这个"Activiti工作流示例Activiti Demo"提供了完整的源代码,帮助开发者深入理解并实际操作...

    Activiti工作流面试相关知识

    Activiti工作流引擎是一款开源的企业级业务流程管理(BPM)和工作流系统,它为组织提供了一种灵活、可扩展的方式来设计、执行和管理业务流程。在面试中,了解Activiti的核心服务对于理解其工作原理和实际应用至关...

    工作流activiti实战项目源码

    本项目“工作流activiti实战项目源码”提供了使用Activiti实现工作流的实例,适合开发者进行学习和实践。 在深入理解这个项目之前,我们先来了解一下Activiti的基本概念和功能: 1. **什么是Activiti**:Activiti ...

    activiti工作流(超详细)

    activiti工作流文档,超详细,从0基础开始入门,包括数据库介绍、核心api等介绍,满足日常开发所需

    工作流activiti源码案例

    工作流Activiti是一个开源的工作流引擎,用于在Java应用程序中实现业务流程自动化。它提供了一套全面的工具和API,使开发人员能够轻松地设计、部署和管理业务流程。在这个"工作流activiti源码案例"中,我们可以深入...

    工作流Activiti的学习总结(十)Activiti手动执行的应用(UserTask)

    在本篇博文中,我们将深入探讨工作流引擎Activiti中手动执行任务(UserTask)的应用。Activiti是一款开源的工作流和业务流程管理(BPM)系统,它提供了强大的流程定义、执行和监控能力。在这个学习总结中,我们将专注于...

    疯狂Workflow讲义 基于Activiti的工作流应用开发 配套源码

    总结,基于Activiti的工作流应用开发是一项复杂但高效的技术,通过理解工作流的基本概念、Activiti的核心功能以及源码实践,开发者能够构建出满足企业需求的流程管理系统。在实际项目中,合理运用Activiti,可以显著...

    Activiti工作流详细讲解完整教程.pdf

    根据提供的文件信息,我们可以深入探讨Activiti工作流框架的相关知识点。 ### Activiti工作流框架概述 Activiti工作流框架是一款由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架。它以其灵活性、易用...

    Activiti工作流学习文件

    ### Activiti工作流实战学习知识点概览 #### 一、工作流与工作流引擎 - **工作流**:指在计算机系统中通过特定的模型表示和实现的工作流程逻辑与规则。这种模型使得文档、信息或任务能够在多个参与者之间按照预定...

    工作流activiti-6.0.0.zip

    这个"工作流activiti-6.0.0.zip"文件包含的是Activiti 6.0.0版本的完整包,通常包括源代码、文档、库文件和其他必要的组件,用于开发和部署基于Activiti的工作流系统。 Activiti 6.0.0是一个重要的版本,因为它引入...

    Activiti工作流引擎入门

    总的来说,Activiti工作流引擎是现代企业级应用中实现业务流程自动化的重要工具,它通过BPMN2.0的标准化建模,为企业提供了强大的流程管理能力,同时降低了系统维护的复杂性和成本。通过深入理解和熟练运用Activiti...

Global site tag (gtag.js) - Google Analytics