JBPM(五)執行流程實例

概念:

ProcessInstance,流程實例:代表流程定義的一次執行.:張三昨天按請假流程請了一次假.一個流程實例包括了所有運行階段,其中最典型的屬性就是跟蹤當前節點的指針,如下圖。

 

Execution,執行:一般情況下,一個流程實例是一個執行樹的根節點。 

使用樹狀結構的原因在於, 這一概念只有一條執行路徑, 使用起來更簡單。業務API不需要了解流程實例和執行之間功能的區別。因此,API裏只有一個執行類型來引用流程實例和執行。

假設匯款和存檔可以同時執行,那麼主流程實例就包含了2個用來跟蹤狀態的子節點:

 

總的來說:

ProcessInstance(流程實例)就是Execution(執行對象),processInstanceId就是executionId。

 在源碼中,ProcessInstance接口直接繼承了Execution接口。

[java] view plain copy
  1. package org.jbpm.api;  
  2.   
  3.   
  4. /** a process instance is one execution of a process definition. 
  5.  * One process instance can have many concurrent executions.   
  6.  * Executions are structured in a tree of which the ProcessInstance  
  7.  * is the root. 
  8.  *  
  9.  * @author Tom Baeyens 
  10.  */  
  11. public interface ProcessInstance extends Execution {  
  12. }  

註釋大概意思爲:

一個流程實例是一個流程定義的執行。

一個流程實例可以有多個同時進行的執行對象。

執行對象構成了一棵樹,而流程實例是這棵樹的根結點。


1.啓動流程實例

a) 普通方法

[java] view plain copy
  1. // 啓動流程實例  
  2. // jbpm4_execution,正在執行的信息表  
  3. // jbpm4_hist_procinst,歷史信息表  
  4. @Test  
  5. public void startProcessInstance() {  
  6.     // 使用指定key的最新版本的流程定義啓動流程實例,返回一個實例流程對象  
  7.     ProcessInstance pi = processEngine.getExecutionService().startProcessInstanceByKey("test");  
  8.   
  9.     System.out.println("id=" + pi.getId()//  
  10.             + ", state=" + pi.getState()//  
  11.             + ", processDefinitionId=" + pi.getProcessDefinitionId());  
  12. }  

b) 啓動流程實例,並設置一些流程變量

[java] view plain copy
  1. Map<String, Object> variables = new HashMap<String, Object>();  
  2. variables.put("申請人""張三");  
  3. variables.put("報銷金額"1000.00);  
  4.        
  5. // 啓動流程實例,並設置一些流程變量  
  6. ProcessInstance pi = processEngine.getExecutionService()
  7.                             .startProcessInstanceByKey(processDefinitionKey, variables);  


2.向後執行一步(Signal

a) 向後執行一步,使用唯一的outcome離開活動

[java] view plain copy
  1. processEngine.getExecutionService().signalExecutionById(executionId);  

b) 向後執行一步,使用唯一的outcome離開活動,並設置一些流程變量

[java] view plain copy
  1. // 準備流程變量  
  2. Map<String, Object> variables = new HashMap<String, Object>();  
  3. variables.put("審批結果""同意");  
  4. processEngine.getExecutionService().signalExecutionById(executionId, variables);  


c) 向後執行一步,使用指定的outcome離開活動

[java] view plain copy
  1. String outcome= "to end1";  
  2. processEngine.getExecutionService().signalExecutionById(executionId, outcome);  

d) 向後執行一步,使用指定的outcome離開活動,並設置一些流程變量

[java] view plain copy
  1. String outcome= "to end1";  
  2. Map<String, Object> variables = new HashMap<String, Object>();  
  3. variables.put("審批結果""同意");  
  4. processEngine.getExecutionService().signalExecutionById(executionId, outcome, variables);  


3.查詢任務

a) 查詢個人任務列表

[java] view plain copy
  1. // 查詢我的未辦理完的任務列表  
  2. // jbpm4_task,正在執行的信息表  
  3. // jbpm4_hist_task,歷史信息表  
  4. @Test  
  5. public void findMyTaskList() {  
  6.     String userId = "員工";  
  7.     //String userId = "部門經理";  
  8.     //String userId = "總經理";  
  9.   
  10.     // 方式1.查詢我所有未辦理的任務的列表  
  11.     // List<Task> list = processEngine.getTaskService().findPersonalTasks(userId);  
  12.     // 方式2.分頁的查詢  
  13.     List<Task> list = processEngine.getTaskService()//  
  14.                 .createTaskQuery()//  
  15.                 .assignee(userId)//  
  16.                 .page(0100)  
  17.                 .list();  
  18.   
  19.     // 顯示  
  20.     System.out.println("============== 【" + userId + "】的未辦理的任務列表 =============");  
  21.     for (Task t : list) {  
  22.         System.out.println("id=" + t.getId()//  
  23.                 + ", name=" + t.getName()// 任務的名稱  
  24.                 + ", assignee=" + t.getAssignee()// 任務的辦理人  
  25.                 + ", createTime=" + t.getCreateTime()// 任務的創建時間  
  26.                 + ", executionId=" + t.getExecutionId()); // 所屬的執行對象的id  
  27.         }  
  28.     }  

b) 查詢組任務列表

方式1

[java] view plain copy
  1. taskService.findGroupTasks(userId);  

方式2 

[java] view plain copy
  1. List<Task> list = processEngine.getTaskService()//  
  2.              .createTaskQuery()//  
  3.              .candidate(userId)//  
  4.              .list();  

4.辦理任務

a) 正常完成任務

[java] view plain copy
  1. @Test  
  2. public void completeTask() {  
  3.     String taskId = "180009";  
  4.     //普通的方法  
  5.     processEngine.getTaskService().completeTask(taskId);  
  6.     //指定下一步的方法  
  7.     processEngine.getTaskService().completeTask(taskId, outcome);  
  8.     //設置流程變量的方法  
  9.     processEngine.getTaskService().completeTask(taskId, outcome, variables);  
  10. }  

b) 自行控制完成任務後是否向後流轉(少用)

[java] view plain copy
  1. String taskId = "120001";  
  2. // 1,設置爲false代表:辦理完任務後不向後移動(默認爲true)  
  3. TaskImpl taskImpl = (TaskImpl) processEngine.getTaskService().getTask(taskId);  
  4. taskImpl.setSignalling(false);  
  5. // 2,辦理完任務  
  6. processEngine.getTaskService().completeTask(taskId);  

5.拾取任務(少用)

a) TaskService.takeTask(taskId, userId),拾取組任務到個人任務列表中,如果任務有assignee,則會拋異常。

b) processEngine.getTaskService().assignTask(taskId, userId),轉交任務給其他人,(如果任務有assignee,則執行這個方法代表重新分配。也可以把assignee設爲null表示組任務沒有人辦理了)

6.設置與獲取流程變量

a) 方式1:根據 executionId 設置或獲取流程變量

[java] view plain copy
  1. ExecutionService.setVariable(executionId, name, value);  
  2. Object obj = executionService.getVariable(executionId, "請假人");  

b) 方式2:根據 taskId 設置或獲取流程變量

[java] view plain copy
  1. TaskService.setVariables(taskId, variables); // 一次設置多個變量  
  2. Object obj = executionService.getVariable(executionId, "請假人");  

7.直接結束流程實例(手工)

[java] view plain copy
  1. String processInstanceId =  "test.10001";  
  2. processEngine.getExecutionService()
  3.                 .endProcessInstance(processInstanceId, ProcessInstance.STATE_ENDED);  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章