流程变量
import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.junit.Test; /** * 在执行流程的过程中产生数据称为流程变量 * 1、流程变量的生命周期 * 就是流程实例 * 2、流程变量和流程实例的关系 * 流程变量必须和流程实例绑定在一起 * 3、通过什么样的方法把一个流程变量存放在流程实例中 * 4、通过什么样的方法把一个流程变量从流程实例中提取出来 * 5、把一个对象放入到流程变量中,该对象必须实现对象的序列化 * @author zd * */ public class VariablesTest { /** * 涉及到的表 * act_hi_varinst varinst:变量实例 * act_ru_variable 存放当前正在执行的流程实例的流程变量 * execution_id_:流程实例ID * proc_inst_id_:流程实例ID * 可以根据流程实例ID获取到该流程实例的流程变量 */ @Test public void testStartPI(){ Map<String, Object> variables = new HashMap<String, Object>(); variables.put("当启动流程实例的时候", "启动流程实例的流程变量"); ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); processEngine.getRuntimeService() //当启动流程实例的时候添加流程变量 .startProcessInstanceByKey("qingjia", variables); } /** * 在完成任务的时候,设置流程变量 */ @Test public void testFinishTask(){ Map<String, Object> variables = new HashMap<String, Object>(); variables.put("请假天数", 3); ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); processEngine.getTaskService() .complete("805", variables); } /** * 在流程实例的任何时候(只要流程实例没有结束),设置流程变量 */ @Test public void testSetVariablesWhenPI(){ ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); processEngine.getRuntimeService() /** * executionId 针对哪一个流程实例设置流程变量 * variableName 变量的名称 * value 变量的值 */ .setVariable("801", "aaa", "aaa"); } /** * 怎么样得到流程变量 */ @Test public void testGetVariables(){ ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取指定的流程实例下面的所有的流程变量 Map<String, Object> variables = processEngine.getRuntimeService() .getVariablesLocal("801"); for (Entry<String, Object> entry:variables.entrySet()) { if(entry.getValue() instanceof Person){ Person person = (Person)entry.getValue(); System.out.println(person.getName()); }else{ System.out.println(entry.getKey()); System.out.println(entry.getValue()); } } } /** * 在流程实例的任何时候(只要流程实例没有结束),设置流程变量 */ @Test public void testSetVariables_Object_WhenPI(){ Person person = new Person(); person.setPid(1L); person.setName("王二麻子"); ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); processEngine.getRuntimeService() /** * executionId 针对哪一个流程实例设置流程变量 * variableName 变量的名称 * value 变量的值 */ .setVariable("801", "person", person); } }
person类
import java.io.Serializable; public class Person implements Serializable{ private Long pid; private String name; public Long getPid() { return pid; } public void setPid(Long pid) { this.pid = pid; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
给任务赋值任务的执行人
在进入该节点之前就能确定任务的执行者
流程图中设置流程变量,如下:
import java.util.HashMap; import java.util.Map; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.junit.Test; /** * <userTask id="申请请假" name="申请请假" activiti:assignee="#{applicator}"></userTask> * 如果一个任务节点的执行人是通过上面的形式赋值的,那么在进入该节点之前,必须给变量applicator赋值(通过流程变量) * @author zd * */ public class Task1Test { @Test public void testDeploy(){ ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); processEngine.getRepositoryService() .createDeployment() .addClasspathResource("com/itheima10/activiti/task/task1.bpmn") .deploy(); } /** * 在启动流程实例的时候,设置流程变量,给aplicator赋值 */ @Test public void testStartPI(){ Map<String, Object> variables = new HashMap<String, Object>(); variables.put("applicator", "张三"); ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); processEngine.getRuntimeService() .startProcessInstanceById("myProcess:1:1204",variables); } /** * 在完成请假申请任务的时候,设置流程变量 */ @Test public void testFinishApplicatorTask(){ Map<String, Object> variables = new HashMap<String, Object>(); variables.put("manager", "李四"); ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); processEngine.getTaskService() .complete("1305", variables); } /** * 在完成部门经理审批的任务的时候,设置流程变量,给总经理任务的执行人赋值 */ @Test public void testFinishManagerTask(){ Map<String, Object> variables = new HashMap<String, Object>(); variables.put("boss", "王五"); ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); processEngine.getTaskService() .complete("1403", variables); } /** * 完成总经理的任务 */ @Test public void testFinishBossTask(){ ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); processEngine.getTaskService() .complete("1503"); } }
在进入该节点之后,才要确定节点的执行者是谁
流程图如下:
1、可以通过MyTaskListener的方式给任务赋值执行人
<userTask id="部门经理审批" name="部门经理审批">
<extensionElements>
<activiti:taskListener event="create" class="com.itheima10.activiti.task.MyTaskListener"></activiti:taskListener>
</extensionElements>
</userTask>
当进入上述的userTask节点之后,立刻执行MyTaskListener的notify方法
delegateTask.setAssignee(manager);就是给MyTaskListener所在的任务节点赋值任务的执行人
说明:该类是由activiti内部调用的,不是由spring容器产生的,所以在notify方法中没有办法使用spring的声明式事务处理产生事务
2、可以通过代码的方式设置任务的执行人
processEngine.getTaskService()
.setAssignee(taskId, userId);
通过该方式也可以给正在执行的任务赋值任务的执行人
package com.itheima10.activiti.task; import java.util.HashMap; import java.util.List; import java.util.Map; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.task.Task; import org.junit.Test; public class Task2Test { @Test public void testDeploy(){ ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); processEngine.getRepositoryService() .createDeployment() .addClasspathResource("com/itheima10/activiti/task/task2.bpmn") .deploy(); } /** * 启动流程实例,并且给流程变量 applicator,manager赋值 */ @Test public void testStartPI(){ Map<String, Object> variables = new HashMap<String, Object>(); variables.put("applicator", "张三"); variables.put("manager","李四"); ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); processEngine.getRuntimeService() .startProcessInstanceById("task2:1:2104", variables); } /** * 根据张三查询任务 */ @Test public void testQueryTaskByAssignee(){ ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); List<Task> tasks = processEngine.getTaskService() .createTaskQuery() .taskAssignee("张三") .orderByTaskCreateTime() .desc() .list(); for (Task task : tasks) { System.out.println(task.getAssignee()); System.out.println(task.getName()); } } @Test public void testFinishTask(){ ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); processEngine.getTaskService().complete("2206"); } }
package com.itheima10.activiti.task; import org.activiti.engine.delegate.DelegateTask; import org.activiti.engine.delegate.TaskListener; public class MyTaskListener implements TaskListener{ /** * */ private static final long serialVersionUID = 1830618442071409874L; @Override public void notify(DelegateTask delegateTask) { String manager = delegateTask.getVariable("manager").toString(); delegateTask.setAssignee(manager); /** * 获得spring容器中的bean
* WebApplicationContext ac = * WebApplicationContextUtils. * getWebApplicationContext(ServletActionContext.getServletContext()); IEmployeeService employeeService = (IEmployeeService) ac.getBean("employeeService"); */ } }