Flowable實戰(七)用戶和組
在流程中,最重要的參與者是用戶。流程定義了任務何時需要用戶參與,什麼用戶可以參與。
組可以理解為我們常說的角色。
Flowable中內置了一套簡單的對用戶和組的支援,身份管理(IDM IDentity Management),但從Flowable V6起,該組件從Flowable引擎模組中抽出。這是因為它不是Flowable引擎的核心內容,而且在很多企業應用中,常常需要結合現有應用系統的用戶和組,並不使用或需要Flowable提供的用戶和組。
一、BPMN2.0 指派用戶和組
用戶和組主要在用戶任務(user task)中使用。當流程執行到達用戶任務時,會為指派至該任務的用戶或組的任務列表添加一個新任務。
1.1 指派用戶
用戶任務可以直接指派(assign)給用戶。
<userTask id="theTask" name="重要任務">
<humanPerformer>
<resourceAssignmentExpression>
<formalExpression>jinyangjie</formalExpression>
</resourceAssignmentExpression>
</humanPerformer>
</userTask>
只能指定一個用戶作為任務的humanPerformer。在Flowable術語中,這個用戶被稱作辦理人(assignee)。擁有辦理人的任務,在其他人的任務列表中不可見,而只能在該辦理人的個人任務列表中看到。
上面的標準用法比較笨重,使用Flowable自定義擴展以減少複雜度。
<userTask id="theTask" name="重要任務" flowable:assignee="jinyangjie"/>
通過TaskService獲取指定用戶待辦理的任務
List<Task> tasks = taskService.createTaskQuery().taskAssignee("jinyangjie").list();
1.2 指派潛在用戶
有時候,我們並不知道任務的具體辦理人是誰,但知道哪些人是潛在的辦理者。比如請假申請時,我們可以向部門經理或者項目經理申請,只要他們中的一個辦理審批即可。
在流程中,使用potentialOwner(潛在用戶)結構指派用戶的候選任務列表。
<userTask id='theTask' name='重要任務' >
<potentialOwner>
<resourceAssignmentExpression>
<formalExpression>user(jinyangjie)</formalExpression>
</resourceAssignmentExpression>
</potentialOwner>
</userTask>
Flowable自定義擴展:
<userTask id="theTask" name="重要任務" flowable:candidateUsers="jinyangjie, zhangsan" />
獲取潛在任務,或者說候選任務列表的方法:
List<Task> tasks = taskService.createTaskQuery().taskCandidateUser("jinyangjie");
在候選列表中,當其中一個潛在用戶申領(claim)任務後,即代表該任務已經指定由申領人辦理。
1.3 指派潛在組
<userTask id='theTask' name='重要任務' >
<potentialOwner>
<resourceAssignmentExpression>
<formalExpression>group(leader)</formalExpression>
</resourceAssignmentExpression>
</potentialOwner>
</userTask>
Flowable自定義擴展:
<userTask id="theTask" name="重要任務" flowable:candidateGroups="leader, manager" />
獲取潛在組任務列表方法:
List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("leader");
1.4 指派潛在用戶和組
<userTask id='theTask' name='重要任務' >
<potentialOwner>
<resourceAssignmentExpression>
<formalExpression>user(jinyangjie), group(leader)</formalExpression>
</resourceAssignmentExpression>
</potentialOwner>
</userTask>
如果並未指定給定字元串是用戶還是組,引擎默認其為組。
二、IDM
IDM(身份管理 IDentity Management)是Flowable提供的用戶和組的管理組件。
默認情況下,IDM引擎在Flowable引擎啟動時初始化並啟動。IDM引擎管理自己的資料庫表結構及下列實體:
- User與UserEntity,用戶資訊。
- Group與GroupEntity,組資訊。
- MembershipEntity,組中的用戶成員。
- Privilege與PrivilegeEntity,許可權定義(例如在Flowable Modeler與Flowable Task應用中,用於控制應用介面的訪問)。
- PrivilegeMappingEntity,將用戶及/或組與許可權關聯。
- Token與TokenEntity,應用介面程式使用的認證令牌。
歷史與當前進行中的流程實例都在資料庫中保存歷史實體,因此可以選擇直接查詢歷史表,以減少對運行時流程實例數據的訪問,並提高運行時執行的性能。
三、自定義指派用戶和組
實際應用中,我們需要自定義指派用戶和組,下面我們通過任務監聽器實現自定義指派。
在用戶任務上添加創建事件(create event)類型的監聽器,調用自定義指派邏輯:
<userTask id="task1" name="我的任務" >
<extensionElements>
<flowable:taskListener event="create" class="org.flowable.MyAssignmentHandler" />
</extensionElements>
</userTask>
傳遞至TaskListener的DelegateTask,可用於設置辦理人與候選用戶/組:
public class MyAssignmentHandler implements TaskListener {
public void notify(DelegateTask delegateTask) {
// 在這裡執行自定義身份查詢
// 然後調用如下命令:
delegateTask.setAssignee("jinyangjie");
delegateTask.addCandidateUser("zhangsan");
delegateTask.addCandidateGroup("leader");
...
}
}
四、小結
事實上,Flowable在運行時並不做任何用戶檢查。例如任務可以分派給任何用戶,而引擎並不會驗證系統中是否存在該用戶。這給我們留下了很大自定義用戶和組的空間,這樣當我們將Flowable嵌入應用時,可以與應用已有的用戶和組結合使用,也可以結合LDAP、Active Directory等服務使用。後續篇章中,我們將會介紹Flowable與LDAP的集成。