activiti的简单入门(2)!

一:流程变量

1.1:概念

流程变量在整个工作流中扮演很重要的作用,在流程中传递信息。

例如:请假流程中有请假天数、请假原因等一些参数都为流程变量的范围。流程变量的作用域范围是流程实例。也就是说各个流程实例的流程变量是不相互影响的。流程实例结束完成以后流程变量还保存在数据库中。

1.2:设置和获取流程变量

1.2.1. 流程图

1.2.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();	
	}

1.2.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
	}

1.2.4. 设置流程变量

@Test
	public void  setVarTest() throws Exception {
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		TaskService taskService = processEngine.getTaskService();
		String processInstanceId="2501";
		String assignee="xx人";
		
		//通过任务服务获取这个流程实例中  xx人的唯一的一个任务
		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.66d);//设置Double
		//设置多个流程变量:
		taskService.setVariables(taskId, variables);
		
		//完成任务的时候设置:
		Map<String,Object> variables1=new HashMap<>();
		variables1.put("老板", "家里有事");
		taskService.complete(taskId, variables1);
	}

1.2.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.3. 流程变量类型

如图是从官网列出来的流程变量的类型:

从图中可以看出包括了大部分封装类型和Date、String和实现了Serializable接口的类的类型。如果想用javabean 作为流程变量,

实现Serializable接口即可。

1.4. 总结

设置流程变量的4种方式:
①:启动流程的时候设置
②:任务完成的时候设置
③:runtimeService设置
④:taskService设置
/获取流程变量的2种方式:
①:runtimeService获取变量
②:taskService获取变量
注意:    
1.流程变量应该可以被所有的执行对象获取(只要流程实例不结束,流程变量可以在任何地方获取)
2.流程变量是可以覆盖的
3.如果存放domain实体类的话就需要这个实体类实现序列化接口 Serializable

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值