概念:
ProcessInstance,流程實例:代表流程定義的一次執行.如:張三昨天按請假流程請了一次假.一個流程實例包括了所有運行階段,其中最典型的屬性就是跟蹤當前節點的指針,如下圖。
Execution,執行:一般情況下,一個流程實例是一個執行樹的根節點。
使用樹狀結構的原因在於, 這一概念只有一條執行路徑, 使用起來更簡單。業務API不需要了解流程實例和執行之間功能的區別。因此,API裏只有一個執行類型來引用流程實例和執行。
假設匯款和存檔可以同時執行,那麼主流程實例就包含了2個用來跟蹤狀態的子節點:
總的來說:
ProcessInstance(流程實例)就是Execution(執行對象),processInstanceId就是executionId。
在源碼中,ProcessInstance接口直接繼承了Execution接口。
-
package org.jbpm.api;
-
-
-
-
-
-
-
-
-
-
public interface ProcessInstance extends Execution {
-
}
註釋大概意思爲:
一個流程實例是一個流程定義的執行。
一個流程實例可以有多個同時進行的執行對象。
執行對象構成了一棵樹,而流程實例是這棵樹的根結點。
1.啓動流程實例
a) 普通方法
-
-
-
-
@Test
-
public void startProcessInstance() {
-
-
ProcessInstance pi = processEngine.getExecutionService().startProcessInstanceByKey("test");
-
-
System.out.println("id=" + pi.getId()
-
+ ", state=" + pi.getState()
-
+ ", processDefinitionId=" + pi.getProcessDefinitionId());
-
}
b) 啓動流程實例,並設置一些流程變量
-
Map<String, Object> variables = new HashMap<String, Object>();
-
variables.put("申請人", "張三");
-
variables.put("報銷金額", 1000.00);
-
-
-
ProcessInstance pi = processEngine.getExecutionService()
-
.startProcessInstanceByKey(processDefinitionKey, variables);
2.向後執行一步(Signal)
a) 向後執行一步,使用唯一的outcome離開活動
-
processEngine.getExecutionService().signalExecutionById(executionId);
b) 向後執行一步,使用唯一的outcome離開活動,並設置一些流程變量
-
-
Map<String, Object> variables = new HashMap<String, Object>();
-
variables.put("審批結果", "同意");
-
processEngine.getExecutionService().signalExecutionById(executionId, variables);
c) 向後執行一步,使用指定的outcome離開活動
-
String outcome= "to end1";
-
processEngine.getExecutionService().signalExecutionById(executionId, outcome);
d) 向後執行一步,使用指定的outcome離開活動,並設置一些流程變量
-
String outcome= "to end1";
-
Map<String, Object> variables = new HashMap<String, Object>();
-
variables.put("審批結果", "同意");
-
processEngine.getExecutionService().signalExecutionById(executionId, outcome, variables);
3.查詢任務
a) 查詢個人任務列表
-
-
-
-
@Test
-
public void findMyTaskList() {
-
String userId = "員工";
-
-
-
-
-
-
-
List<Task> list = processEngine.getTaskService()
-
.createTaskQuery()
-
.assignee(userId)
-
.page(0, 100)
-
.list();
-
-
-
System.out.println("============== 【" + userId + "】的未辦理的任務列表 =============");
-
for (Task t : list) {
-
System.out.println("id=" + t.getId()
-
+ ", name=" + t.getName()
-
+ ", assignee=" + t.getAssignee()
-
+ ", createTime=" + t.getCreateTime()
-
+ ", executionId=" + t.getExecutionId());
-
}
-
}
b) 查詢組任務列表
方式1:
-
taskService.findGroupTasks(userId);
方式2:
-
List<Task> list = processEngine.getTaskService()
-
.createTaskQuery()
-
.candidate(userId)
-
.list();
4.辦理任務
a) 正常完成任務
-
@Test
-
public void completeTask() {
-
String taskId = "180009";
-
-
processEngine.getTaskService().completeTask(taskId);
-
-
processEngine.getTaskService().completeTask(taskId, outcome);
-
-
processEngine.getTaskService().completeTask(taskId, outcome, variables);
-
}
b) 自行控制完成任務後是否向後流轉(少用)
-
String taskId = "120001";
-
-
TaskImpl taskImpl = (TaskImpl) processEngine.getTaskService().getTask(taskId);
-
taskImpl.setSignalling(false);
-
-
processEngine.getTaskService().completeTask(taskId);
5.拾取任務(少用)
a) TaskService.takeTask(taskId, userId),拾取組任務到個人任務列表中,如果任務有assignee,則會拋異常。
b) processEngine.getTaskService().assignTask(taskId, userId),轉交任務給其他人,(如果任務有assignee,則執行這個方法代表重新分配。也可以把assignee設爲null表示組任務沒有人辦理了)
6.設置與獲取流程變量
a) 方式1:根據 executionId 設置或獲取流程變量
-
ExecutionService.setVariable(executionId, name, value);
-
Object obj = executionService.getVariable(executionId, "請假人");
b) 方式2:根據 taskId 設置或獲取流程變量
-
TaskService.setVariables(taskId, variables);
-
Object obj = executionService.getVariable(executionId, "請假人");
7.直接結束流程實例(手工)
-
String processInstanceId = "test.10001";
-
processEngine.getExecutionService()
-
.endProcessInstance(processInstanceId, ProcessInstance.STATE_ENDED);