0基础学习Activiti工作流——进阶之流程变量

流程变量在整个工作流中扮演很重要的作用。

请假流程实例

一、概念

以上图为例,在一个请假流程中,请假天数、请假原因等一些参数都为流程变量的范围。流程变量的作用域范围是流程实例。也就是说各个流程实例的流程变量是不会相互影响的。流程实例结束完成以后流程变量还保存在数据库中(存放到流程变量的历史表中)。

二、作用

在流程中传递信息(共享信息)。

三、设置和获取流程变量

1.流程图
在这里插入图片描述
2.部署流程定义

	@Test
	public void deployTest() {
		//获取核心对象
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		//获取服务
		RepositoryService repositoryService = processEngine.getRepositoryService();
		//操作
		DeploymentBuilder deploymentBuilder = repositoryService.createDeployment();
		deploymentBuilder
				.name("请假流程")//设置部署名称
				.addClasspathResource("ProcessVarTest.bpmn")
				.addClasspathResource("ProcessVarTest.png");
		deploymentBuilder.deploy();	
	}

3.启动流程实例

@Test
public void  startProcessTest() throws Exception {
	//创建核心对象
	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
	//获取服务
	RuntimeService runtimeService = processEngine.getRuntimeService();
	String processDefinitionKey="ProcessVarTestId";
	Map<String,Object> variables=new HashMap<>();
	variables.put("剩余年假天数", 3);
	variables.put("剩余病假天数", 10);
	//操作:启动的时候设置流程变量
	ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey, variables);
	System.out.println("pId="+processInstance.getId());//2501
}

4.设置流程变量

@Test
public void  setVarTest() throws Exception {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
String processInstanceId="2501";
String assignee="小莉";

//通过任务服务获取这个流程实例中  小莉的唯一的一个任务
Task task = taskService.createTaskQuery()
.processInstanceId(processInstanceId)//在一次流程实例中一个人的任务是唯一的
.taskAssignee(assignee)
.singleResult();
System.out.println(task);

//设置一个流程变量
String taskId = task.getId();
taskService.setVariable(taskId, "请假人", assignee);
Map<String,Object> variables=new HashMap<>();
variables.put("请假原因","想男朋友了");//设置String
variables.put("请假天数", 3);//设置Integer
variables.put("是否扣工资",true);//设置boolean:存long型:1true;0false
variables.put("请假开始时间", new Date());//设置Date类型
variables.put("扣多少钱", 666.666d);//设置Double
//设置多个流程变量:
taskService.setVariables(taskId, variables);

//完成任务的时候设置:
Map<String,Object> variables1=new HashMap<>();
variables1.put("叫老板", "亲爱的老板,我真的要回去找男朋友,很急的。。。。。");
taskService.complete(taskId, variables1);
}

5.获取流程变量

/**
 * 获取流程变量的方式:
 * @throws Exception
 */
@Test
public void  getVarTest() throws Exception {
	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
	TaskService taskService = processEngine.getTaskService();
	String processInstanceId="2501";
	String assignee="美丽";
	//一个流程实例中,一个办理人只有一个任务
	Task task = taskService.createTaskQuery().
			processInstanceId(processInstanceId).
			taskAssignee(assignee)
			.singleResult();
	String taskId=task.getId();
	
	Map<String, Object> variables = taskService.getVariables(taskId);
	System.out.println("所有的流程变量:"+variables);
	Map<String, Object> variables2 = taskService.getVariables(taskId, Arrays.asList("请假天数","叫老板"));
	System.out.println("批量获取流程变量:"+variables2);
	Double money = (Double) taskService.getVariable(taskId, "扣多少钱");
	System.out.println("获取一个变量:"+money);
	Date beginDate = taskService.getVariable(taskId, "请假开始时间",Date.class);
	System.out.println("获取一个变量:"+beginDate);
}

重点注意:
1)流程变量的作用域就是流程实例,所以只要设置就行了,不用管在哪个阶段设置;流程变量的获取针对流程实例(即1个流程),每个流程实例获取的流程变量是不同的;
2)基本类型设置/获取流程变量,在taskService中使用任务ID,定义流程变量的名称,设置/获取流程变量的值。
3)Javabean类型设置流程变量,除了需要这个javabean实现了Serializable接口,还要求流程变量对象的属性不能发生变化,否则抛出异常。解决方案,固定序列化ID
4)设置流程变量的时候,向act_ru_variable这个表添加数据

四、流程变量类型

官网列出:
在这里插入图片描述
从图中可以看出包括了大部分封装类型和Date、String和实现了Serializable接口的类的类型。如果想用javabean 作为流程变量,有两种情况:
1、是hibernate的实体类型(持久化类、映射文件)
主键的类型必须是long或者string
2、实现Serializable接口即可

综上操作类型总结:

**基本类型:直接操作
对象类型:实现序列化接口 **

五、设置获取流程变量方式

1.设置流程变量:4种
①:启动流程的时候设置
②:任务完成的时候设置
③:runtimeService设置
④:taskService设置
2.获取流程变量:2种
①:runtimeService获取变量
②:taskService获取变量

@Test
public void  setVarAndGetVarTest() throws Exception {
	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
	RuntimeService runtimeService = processEngine.getRuntimeService();
	TaskService taskService = processEngine.getTaskService();
	//设置流程变量:4种
		//①:启动流程的时候设置
			//runtimeService.startProcessInstanceByKey(processDefinitionKey, variables);
		//②:任务完成的时候设置
			//taskService.complete(taskId, variables);
		//③:runtimeService设置
	 		//runtimeService.setVariable(executionId, variableName, value);//存一个
	 		//runtimeService.setVariables(executionId, variables);//存多个
		//④:taskService设置
			//taskService.setVariable(taskId, variableName, value);//存一个
			//taskService.setVariables(taskId, variables);//存多个
	//获取流程变量:2种
		//①:runtimeService获取变量
			//runtimeService.getVariables(executionId)//获取所有
			//runtimeService.getVariables(executionId, variableNames)//批量获取
			//runtimeService.getVariable(executionId, variableName);//获取一个,但是要强转
			//runtimeService.getVariable(executionId, variableName, variableClass)//获取一个,带泛型,不强转
		//②:taskService获取变量
			//taskService.getVariables(taskId)//获取所有
			//taskService.getVariables(taskId, variableNames)//批量获取
			//taskService.getVariable(taskId, variableName);//获取一个,但是要强转
			//taskService.getVariable(taskId, variableName, variableClass)//获取一个,带泛型,不强转
}

重点总结:
1)RuntimeService对象可以设置流程变量和获取流程变量
2)TaskService对象可以设置流程变量和获取流程变量
3)流程实例启动的时候可以设置流程变量
4)任务办理完成的时候可以设置流程变量
5)流程变量可以通过名称/值的形式设置单个流程变量
6)流程变量可以通过Map集合,同时设置多个流程变量
Map集合的key表示流程变量的名称
Map集合的value表示流程变量的值

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值