ProcessDefinition :
這個最好理解,就是流程的定義,也就相當於規範。
ProcessDefinition也有id,這個id是 {key}-{version}
在部署過程中,會把一個id分配給流程定義。 這個id的格式為{key}-{version}, key和version之間使用連字號串連。
如果沒有提供key, 會在名字的基礎自動產生。 產生的key會把所有不是字母和數位字元替換成底線。
ProcessInstance :
這個也比較好理解,就是流程的一個執行個體。
在系統中,也有一個ProcessInstance的Id
key可以用來建立流程執行個體的id, 格式為{process-key}.{execution-id}。
如果沒有提供使用者定義的key,資料庫就會把主鍵作為key。
用Java來講: ProcessDefinition就是代碼中的一個類,而ProcessInstance就是把這個類new了出來,建立了一個執行個體;
Execution :目前這個還比較難以理解。
在jBPM官方上是這麼說的:
http://jboss.org/jbpm 寫道
Each execution of a process definition is called a process instance.
每一個流程定義的實施,被成為process instance。這個只講了ProcessDefinition與ProcessInstance之間的關係。
在ExecutionService中,start的是ProcessInstance。
在ProcessInstance的JavaDoc中把ProcessInstance和Execution區別講了出來:
ProcessInstance的Javadoc 寫道
a process instance is one execution of a process definition. One process instance can have many concurrent executions. Executions are structured in a tree of which the ProcessInstance is the root.
一個Process Instance(流程執行個體)是一個ProcessDefinition(流程定義)的執行;
一個Process Instance(流程執行個體)可以有許多同時執行的步驟(concurrent executions)
執行步驟組成了以ProcessIntance(流程執行個體)為根節點(root)的結構化樹
在文檔中,關於ExecutionId和ProcessId,在介紹的時候有這麼一句:
http://www.family168.com/tutorial/jbpm4.0/html/services.html 寫道
有時execution id和流程執行個體id是不同的 ,當一個節點中使用了定時器,execution id中就會使用額外的尾碼, 這就會導致當我們通過execution id查詢時,這個節點不會出現在結果清單中。
實際操作下來也是如此:
剛開始的時候,ExectionId與ProcessId是相同的;
如果流程執行中,每時刻只有一個步驟(是否可以說任務)在處理,則ExectionId和ProcessId是相同的,
但是當同一時刻有多個任務要處理,譬如上述的定時器、或者進入fork/join流程,這個時候ExectionId和ProcessId就不同。
可以理解為Execution為執行路徑,當同時有幾個路徑在執行,ExecutionId就和ProcessId不同了
而且:Execution是ProcessInstance的基類
具體的表現就是
Java代碼
// get execution service
ExecutionService executionService = processEngine.getExecutionService();
// get current execution through processId
Execution execution = executionService.findExecutionById(processId);
// get a task query
TaskQuery tq = taskService.createTaskQuery();
// get current task
List<Task> taskList1 = tq.executionId(execution.getId()).list();
List<Task> taskList2 = tq.processInstanceId(processId).list();
// get execution service ExecutionService executionService = processEngine.getExecutionService(); // get current execution through processId Execution execution = executionService.findExecutionById(processId); // get a task query TaskQuery tq = taskService.createTaskQuery(); // get current task List<Task> taskList1 = tq.executionId(execution.getId()).list(); List<Task> taskList2 = tq.processInstanceId(processId).list();
上述的程式,如果在一般時候,taskList1,和taskList2是一樣的。
但是當進入fork/join流程,這個時候executionId已經更改,
taskList1取不到任何任務,taskList2能取回任務
Task :
Task簡單,就是當前要做的工作。
JavaDoc中 寫道
a runtime task. In contrast to HistoryTask, a Task only represents the runtime state of a task and hence it will be deleted after it is completed.