JBPM4.4:ProcessDefinition/ProcessInstance/Execution/Task關係和區別

來源:互聯網
上載者:User

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.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.