Activiti學習筆記10 — 動態任務分配


動態任務分配使用的兩種方式

一、通過特殊表達式,來獲取任務信息 ,在流程 UserTask節點上設置 ${流程變量的Key}

1、流程定義

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 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">
 3   <process id="userDynamicTask1" name="動態任務處理1" isExecutable="true">
 4     <startEvent id="startevent1" name="Start"></startEvent>
 5     <userTask id="休假" name="休假" activiti:assignee="${user}"></userTask>
 6     <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="休假"></sequenceFlow>
 7     <endEvent id="endevent1" name="End"></endEvent>
 8     <sequenceFlow id="flow2" sourceRef="休假" targetRef="endevent1"></sequenceFlow>
 9   </process>
10   <bpmndi:BPMNDiagram id="BPMNDiagram_userDynamicTask1">
11     <bpmndi:BPMNPlane bpmnElement="userDynamicTask1" id="BPMNPlane_userDynamicTask1">
12       <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
13         <omgdc:Bounds height="35.0" width="35.0" x="340.0" y="110.0"></omgdc:Bounds>
14       </bpmndi:BPMNShape>
15       <bpmndi:BPMNShape bpmnElement="休假" id="BPMNShape_休假">
16         <omgdc:Bounds height="55.0" width="105.0" x="305.0" y="180.0"></omgdc:Bounds>
17       </bpmndi:BPMNShape>
18       <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
19         <omgdc:Bounds height="35.0" width="35.0" x="340.0" y="270.0"></omgdc:Bounds>
20       </bpmndi:BPMNShape>
21       <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
22         <omgdi:waypoint x="357.0" y="145.0"></omgdi:waypoint>
23         <omgdi:waypoint x="357.0" y="180.0"></omgdi:waypoint>
24       </bpmndi:BPMNEdge>
25       <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
26         <omgdi:waypoint x="357.0" y="235.0"></omgdi:waypoint>
27         <omgdi:waypoint x="357.0" y="270.0"></omgdi:waypoint>
28       </bpmndi:BPMNEdge>
29     </bpmndi:BPMNPlane>
30   </bpmndi:BPMNDiagram>
31 </definitions>
View Code

2、發布流程

 1 /**
 2      * 2、發布一個流程:發布通過特殊表達式,來獲取任務信息  ${流程變量的Key}的流程
 3      */
 4     @Test
 5     public void  testDeployProcess() {
 6         RepositoryService repositoryService = processEngine.getRepositoryService();
 7         DeploymentBuilder builder = repositoryService.createDeployment();
 8         // 加載發布資源
 9         builder.name("動態任務處理流程1-測試") // 設置流程顯示別名
10                 .addClasspathResource("leave3.bpmn") // 設置流程規則文件
11                 .addClasspathResource("leave3.png"); // 設置流程規則的圖片
12         // 發布流程
13         builder.deploy();
14     }
View Code

3、啟動與測試流程

 1     
 2     /**
 3      * 3、啟動流程、執行任務,並查看狀態
 4      */
 5     @Test
 6     public void testUserTask() {        
 7         // 獲取RuntimeService服務對象的實例
 8         RuntimeService runtimeService = processEngine.getRuntimeService();
 9         String processDefinitionKey = "userDynamicTask1";
10         // 自動執行與Key相對應的流程的最高版本
11         Map<String, Object> variables = new HashMap<String, Object>();
12         //variables.put("user", "張三");
13         variables.put("user", "李四");
14         
15         ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey,variables);        
16         String processInstanceId = processInstance.getId();        
17         logger.info("processInstanceId:" + processInstance.getId());
18         
19         // 獲取TaskService服務對象的實例
20         TaskService taskService = processEngine.getTaskService();
21         //String assignee = "張三";
22         String assignee = "李四";
23         List<Task> tasks = taskService.createTaskQuery().taskAssignee(assignee).list();
24         Assert.assertEquals(1, tasks.size());
25         Task task = tasks.get(0);        
26         logger.info("taskName:" + task.getName());
27         logger.info("taskAssignee:" + task.getAssignee());
28         Assert.assertEquals("休假",task.getName());
29         
30         //完成任務
31         taskService.complete(task.getId());        
32         
33         //檢查結束狀態
34         ProcessInstance pInstance = runtimeService
35                                                         .createProcessInstanceQuery()
36                                                         .processInstanceId(processInstanceId)
37                                                         .singleResult();
38         Assert.assertNull(pInstance);
39         logger.info("動態任務處理流程1,使用${流程變量的Key}方式成功執行!");        
40         
41     }
View Code

4、運行結果

[INFO][2015-12-02 11:44:05,129][com.mcs.activiti.test.TestUserTaskDynamic]processInstanceId:130001
[INFO][2015-12-02 11:44:05,159][com.mcs.activiti.test.TestUserTaskDynamic]taskName:休假
[INFO][2015-12-02 11:44:05,159][com.mcs.activiti.test.TestUserTaskDynamic]taskAssignee:李四
[INFO][2015-12-02 11:44:05,456][com.mcs.activiti.test.TestUserTaskDynamic]動態任務處理流程1,使用${流程變量的Key}方式成功執行!

二、使用任務分配處理器

1、自定義任務分配處理器步驟

  1.1、  創建一個類來充分“任務分配處理器”,需要實現TaskListener

  1.2、  在實現方式中添加響應的處理邏輯;

  1.3、  在流程中,配置/使用任務處理器。

2、創建自定義任務分配處理器,實現TaskListener

 1 package mcs.listener;
 2 
 3 import org.activiti.engine.delegate.DelegateTask;
 4 import org.activiti.engine.delegate.TaskListener;
 5 
 6 public class ManagerTaskListenerHandler implements TaskListener {
 7 
 8     private static final long serialVersionUID = 1L;
 9 
10     @Override
11     public void notify(DelegateTask delegateTask) {
12         String assignee = "王五";
13         delegateTask.setAssignee(assignee);
14         
15         //delegateTask.addCandidateUser("王小二");
16     }
17 
18 }
View Code

3、流程定義

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 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">
 3   <process id="userDynamicTask2" name="動態任務處理2" isExecutable="true">
 4     <startEvent id="startevent1" name="Start"></startEvent>
 5     <endEvent id="endevent1" name="End"></endEvent>
 6     <userTask id="休假" name="休假">
 7       <extensionElements>
 8         <activiti:taskListener event="create" class="mcs.listener.ManagerTaskListenerHandler"></activiti:taskListener>
 9       </extensionElements>
10     </userTask>
11     <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="休假"></sequenceFlow>
12     <sequenceFlow id="flow2" sourceRef="休假" targetRef="endevent1"></sequenceFlow>
13   </process>
14   <bpmndi:BPMNDiagram id="BPMNDiagram_userDynamicTask2">
15     <bpmndi:BPMNPlane bpmnElement="userDynamicTask2" id="BPMNPlane_userDynamicTask2">
16       <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
17         <omgdc:Bounds height="35.0" width="35.0" x="340.0" y="110.0"></omgdc:Bounds>
18       </bpmndi:BPMNShape>
19       <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
20         <omgdc:Bounds height="35.0" width="35.0" x="340.0" y="270.0"></omgdc:Bounds>
21       </bpmndi:BPMNShape>
22       <bpmndi:BPMNShape bpmnElement="休假" id="BPMNShape_休假">
23         <omgdc:Bounds height="55.0" width="105.0" x="305.0" y="180.0"></omgdc:Bounds>
24       </bpmndi:BPMNShape>
25       <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
26         <omgdi:waypoint x="357.0" y="145.0"></omgdi:waypoint>
27         <omgdi:waypoint x="357.0" y="180.0"></omgdi:waypoint>
28       </bpmndi:BPMNEdge>
29       <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
30         <omgdi:waypoint x="357.0" y="235.0"></omgdi:waypoint>
31         <omgdi:waypoint x="357.0" y="270.0"></omgdi:waypoint>
32       </bpmndi:BPMNEdge>
33     </bpmndi:BPMNPlane>
34   </bpmndi:BPMNDiagram>
35 </definitions>
View Code

4、發布流程

 1 /**
 2      * 4、發布一個流程:發布通過自定義任務分配處理器的流程
 3      *         自定義任務分配處理器步驟:
 4      *         1、創建一個類來充分“任務分配處理器”,需要實現TaskListener
 5     *        2、在實現方式中添加響應的處理邏輯;
 6     *        3、在流程中,配置/使用任務處理器。
 7      */
 8     @Test
 9     public void  testDeployProcess2() {
10         RepositoryService repositoryService = processEngine.getRepositoryService();
11         DeploymentBuilder builder = repositoryService.createDeployment();
12         // 加載發布資源
13         builder.name("動態任務處理流程2-測試") // 設置流程顯示別名
14                 .addClasspathResource("leave4.bpmn") // 設置流程規則文件
15                 .addClasspathResource("leave4.png"); // 設置流程規則的圖片
16         // 發布流程
17         builder.deploy();
18     }
19     
View Code

5、啟動與測試流程

 1     /**
 2      * 5、啟動流程、執行任務,並查看狀態
 3      */
 4     @Test
 5     public void testUserTask2() {        
 6         // 獲取RuntimeService服務對象的實例
 7         RuntimeService runtimeService = processEngine.getRuntimeService();
 8         String processDefinitionKey = "userDynamicTask2";
 9         // 自動執行與Key相對應的流程的最高版本    
10         ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);        
11         String processInstanceId = processInstance.getId();        
12         logger.info("processInstanceId:" + processInstance.getId());
13         
14         // 獲取TaskService服務對象的實例
15         TaskService taskService = processEngine.getTaskService();
16         String assignee = "王五";
17         List<Task> tasks = taskService.createTaskQuery().taskAssignee(assignee).list();
18         Assert.assertEquals(1, tasks.size());
19         Task task = tasks.get(0);        
20         logger.info("taskName:" + task.getName());
21         logger.info("taskAssignee:" + task.getAssignee());
22         Assert.assertEquals("休假",task.getName());
23         
24         //完成任務
25         taskService.complete(task.getId());        
26         
27         //檢查結束狀態
28         ProcessInstance pInstance = runtimeService
29                                                         .createProcessInstanceQuery()
30                                                         .processInstanceId(processInstanceId)
31                                                         .singleResult();
32         Assert.assertNull(pInstance);
33         logger.info("動態任務處理流程2,使用自定義任務分配處理器方式成功執行!");        
34         
35     }
View Code

6、運行結果

[INFO][2015-12-02 11:46:51,818][com.mcs.activiti.test.TestUserTaskDynamic]processInstanceId:132501
[INFO][2015-12-02 11:46:51,879][com.mcs.activiti.test.TestUserTaskDynamic]taskName:休假
[INFO][2015-12-02 11:46:51,879][com.mcs.activiti.test.TestUserTaskDynamic]taskAssignee:王五
[INFO][2015-12-02 11:46:52,192][com.mcs.activiti.test.TestUserTaskDynamic]動態任務處理流程2,使用自定義任務分配處理器方式成功執行!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM