Activiti5工作流筆記二
阿新 • • 發佈:2018-07-15
klist system activit RoCE ima obj rep ddc out
流程變量
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"); */ } }
Activiti5工作流筆記二