??在流程中,最重要的參與者是用戶。流程定義了任務(wù)何時需要用戶參與坤邪,什么用戶可以參與惭蹂。
??組可以理解為我們常說的角色伞插。
??Flowable中內(nèi)置了一套簡單的對用戶和組的支持,身份管理(IDM IDentity Management)盾碗,但從Flowable V6起媚污,該組件從Flowable引擎模塊中抽出。這是因為它不是Flowable引擎的核心內(nèi)容廷雅,而且在很多企業(yè)應(yīng)用中耗美,常常需要結(jié)合現(xiàn)有應(yīng)用系統(tǒng)的用戶和組,并不使用或需要Flowable提供的用戶和組榜轿。
一幽歼、BPMN2.0 指派用戶和組
??用戶和組主要在用戶任務(wù)(user task)中使用。當(dāng)流程執(zhí)行到達(dá)用戶任務(wù)時谬盐,會為指派至該任務(wù)的用戶或組的任務(wù)列表添加一個新任務(wù)甸私。
1.1 指派用戶
??用戶任務(wù)可以直接指派(assign)給用戶。
<userTask id="theTask" name="重要任務(wù)">
<humanPerformer>
<resourceAssignmentExpression>
<formalExpression>jinyangjie</formalExpression>
</resourceAssignmentExpression>
</humanPerformer>
</userTask>
??只能指定一個用戶作為任務(wù)的humanPerformer飞傀。在Flowable術(shù)語中皇型,這個用戶被稱作辦理人(assignee)诬烹。擁有辦理人的任務(wù),在其他人的任務(wù)列表中不可見弃鸦,而只能在該辦理人的個人任務(wù)列表中看到绞吁。
??上面的標(biāo)準(zhǔn)用法比較笨重,使用Flowable自定義擴(kuò)展以減少復(fù)雜度唬格。
<userTask id="theTask" name="重要任務(wù)" flowable:assignee="jinyangjie"/>
??通過TaskService獲取指定用戶待辦理的任務(wù)
List<Task> tasks = taskService.createTaskQuery().taskAssignee("jinyangjie").list();
1.2 指派潛在用戶
??有時候家破,我們并不知道任務(wù)的具體辦理人是誰,但知道哪些人是潛在的辦理者购岗。比如請假申請時汰聋,我們可以向部門經(jīng)理或者項目經(jīng)理申請,只要他們中的一個辦理審批即可喊积。
??在流程中烹困,使用potentialOwner(潛在用戶)結(jié)構(gòu)指派用戶的候選任務(wù)列表。
<userTask id='theTask' name='重要任務(wù)' >
<potentialOwner>
<resourceAssignmentExpression>
<formalExpression>user(jinyangjie)</formalExpression>
</resourceAssignmentExpression>
</potentialOwner>
</userTask>
??Flowable自定義擴(kuò)展:
<userTask id="theTask" name="重要任務(wù)" flowable:candidateUsers="jinyangjie, zhangsan" />
??獲取潛在任務(wù)乾吻,或者說候選任務(wù)列表的方法:
List<Task> tasks = taskService.createTaskQuery().taskCandidateUser("jinyangjie");
??在候選列表中髓梅,當(dāng)其中一個潛在用戶申領(lǐng)(claim)任務(wù)后,即代表該任務(wù)已經(jīng)指定由申領(lǐng)人辦理绎签。
1.3 指派潛在組
<userTask id='theTask' name='重要任務(wù)' >
<potentialOwner>
<resourceAssignmentExpression>
<formalExpression>group(leader)</formalExpression>
</resourceAssignmentExpression>
</potentialOwner>
</userTask>
??Flowable自定義擴(kuò)展:
<userTask id="theTask" name="重要任務(wù)" flowable:candidateGroups="leader, manager" />
??獲取潛在組任務(wù)列表方法:
List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("leader");
1.4 指派潛在用戶和組
<userTask id='theTask' name='重要任務(wù)' >
<potentialOwner>
<resourceAssignmentExpression>
<formalExpression>user(jinyangjie), group(leader)</formalExpression>
</resourceAssignmentExpression>
</potentialOwner>
</userTask>
??如果并未指定給定字符串是用戶還是組枯饿,引擎默認(rèn)其為組。
二辜御、IDM
??IDM(身份管理 IDentity Management)是Flowable提供的用戶和組的管理組件鸭你。
??默認(rèn)情況下,IDM引擎在Flowable引擎啟動時初始化并啟動擒权。IDM引擎管理自己的數(shù)據(jù)庫表結(jié)構(gòu)及下列實體:
- User與UserEntity袱巨,用戶信息。
- Group與GroupEntity碳抄,組信息愉老。
- MembershipEntity,組中的用戶成員剖效。
- Privilege與PrivilegeEntity嫉入,權(quán)限定義(例如在Flowable Modeler與Flowable Task應(yīng)用中,用于控制應(yīng)用界面的訪問)璧尸。
- PrivilegeMappingEntity咒林,將用戶及/或組與權(quán)限關(guān)聯(lián)。
- Token與TokenEntity爷光,應(yīng)用界面程序使用的認(rèn)證令牌垫竞。
??歷史與當(dāng)前進(jìn)行中的流程實例都在數(shù)據(jù)庫中保存歷史實體,因此可以選擇直接查詢歷史表,以減少對運行時流程實例數(shù)據(jù)的訪問欢瞪,并提高運行時執(zhí)行的性能活烙。
三、自定義指派用戶和組
??實際應(yīng)用中遣鼓,我們需要自定義指派用戶和組啸盏,下面我們通過任務(wù)監(jiān)聽器實現(xiàn)自定義指派。
??在用戶任務(wù)上添加創(chuàng)建事件(create event)類型的監(jiān)聽器骑祟,調(diào)用自定義指派邏輯:
<userTask id="task1" name="我的任務(wù)" >
<extensionElements>
<flowable:taskListener event="create" class="org.flowable.MyAssignmentHandler" />
</extensionElements>
</userTask>
??傳遞至TaskListener的DelegateTask回懦,可用于設(shè)置辦理人與候選用戶/組:
public class MyAssignmentHandler implements TaskListener {
public void notify(DelegateTask delegateTask) {
// 在這里執(zhí)行自定義身份查詢
// 然后調(diào)用如下命令:
delegateTask.setAssignee("jinyangjie");
delegateTask.addCandidateUser("zhangsan");
delegateTask.addCandidateGroup("leader");
...
}
}
四、小結(jié)
??事實上曾我,F(xiàn)lowable在運行時并不做任何用戶檢查粉怕。例如任務(wù)可以分派給任何用戶健民,而引擎并不會驗證系統(tǒng)中是否存在該用戶抒巢。這給我們留下了很大自定義用戶和組的空間,這樣當(dāng)我們將Flowable嵌入應(yīng)用時秉犹,可以與應(yīng)用已有的用戶和組結(jié)合使用蛉谜,也可以結(jié)合LDAP、Active Directory等服務(wù)使用崇堵。后續(xù)篇章中型诚,我們將會介紹Flowable與LDAP的集成。