jbpm的任務管理實現

一個Task instance(任務實例)可以被分配給一個actorId (java.lang.String)。所有的Task instance都被保存在數據庫中的表jbpm_taskinstance裏。當你想得到特定用戶的任務清單時,你就可以通過一個與用戶關聯的actorId來查詢這張表。

一個流程定義有一個TaskMgmtDefinition;一個TaskMgmtDefinition對應多個swimlane,同時對應多個task;一個swimlane有多個task,可以從TaskMgmtDefinition中通過task的名稱直接獲取相應的task;

swimlane對象有四個屬性,分別是name(名字)、assignmentDelegation(分配代理類)、taskMgmtDefinition、tasks(Set 對應多個task),可以增加task

task對象主要的屬性:taskMgmtDefinition、swimlane、assignmentDelegation、taskNode,需要注意的是swimlane和assignmentDelegation中間只是可以一個屬性有值,因爲它們都和任務的分配有關係。

一個流程實例有一個TaskMgmtInstance;一個TaskMgmtInstance對應多個swimlaneInstance,同時對應多個taskInstance;一個swimlaneInstance有多個taskInstance,可以從TaskMgmtInstance中直接獲取相應的taskInstance;

swimlaneInstance對象主要有五個屬性,分別是name、actorId、pooledActors(Set)、swimlane、taskMgmtInstance。
taskInstance對象的主要屬性:name、actorId、task、swimlaneInstance、taskMgmtInstance、pooledActors。

當對任務進行分配時,一般需要實現AssignmentHandler這個接口,這個接口的方法只有一個:
void assign( Assignable assignable, ExecutionContext executionContext ) throws Exception;
一個典型的實現(把名字是'change nappy'的任務交給NappyAssignmentHandler這個類來分配)



NappyAssignmentHandler類:
public void assign(Assignable assignable, ExecutionContext executionContext) {
assignable.setActorId("papa");
}
同樣,Assignable只是一個接口,它有兩個方法:setActorId()和setPooledActors(),Assignable的具體實現類也是兩個
swimlaneInstancehe和taskInstance。這樣就不不難理解整個任務分配流程了:
1、流程進入TaskNode節點,執行TaskNode類的execute()方法,該方法首先獲得TaskMgmtInstance實例,然後通過它來創建TaskInstance。taskMgmtInstance.createTaskInstance(task, executionContext);
2、在上面的createTaskInstance(task, executionContext)裏,該方法調用了taskInstance.assign(executionContext)對taskInstance進行分配。
3、在assign(executionContext)方法裏,首先會判斷task屬性裏是否存在swimlane,如果有的話,這個taskInstance就會分配給swimlane指定的ActorId或 PooledActors;如果不存在,再去找task屬性裏 assignmentDelegation(分配代理類)通過代理類(即我們自己寫的實現AssignmentHandler這個接口的類)指定ActorId或 PooledActors。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章