ProcessDefinition/ProcessInstance/Execution/Task關係和區別

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的基類

// 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簡單,就是當前要做的工作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章