activiti 使用者任務分配指定
使用者任務分配辦理人:
1.使用者任務可以直接分配給一個使用者,這可以通過humanPerformer元素定義。 humanPerformer定義需要一個 resourceAssignmentExpression
來實際定義使用者
eg: <userTask id='theTask' name='important task' >
<humanPerformer>
<resourceAssignmentExpression>
<formalExpression>kermit</formalExpression>
</resourceAssignmentExpression>
</humanPerformer>
</userTask>
任務只有一個使用者的時候在activiti中,使用者叫做執行者。 擁有執行者的task不會出現在其他人的任務列表中, 只能出現執行者的個人任務列表中。
直接分配給使用者的任務可以通過TaskService像下面這樣獲取:
List<Task> tasks = taskService.createTaskQuery().taskAssignee("kermit").list();
2.任務也可以加入到人員的候選人員列表中。需要使用potentialOwner元素。 用法和humanPerformer元素類似,注意它需要指定表示式中的每個
專案是人員還是群組 (引擎猜不出來)。
eg:
<userTask id='theTask' name='important task' >
<potentialOwner>
<resourceAssignmentExpression>
<formalExpression>user(kermit), group(management)</formalExpression>
</resourceAssignmentExpression>
</potentialOwner>
</userTask>
分配給候選使用者列表或組的任務可以通過TaskService像下面這樣獲取:
List<Task> tasks = taskService.createTaskQuery().taskCandidateUser("kermit").list();
//List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("kermit").list();
此時對應辦理人必須拾取任務,方能辦理成功,任務被其中一個人拾取後,其他人不可見此任務
任務拾取方法: processEngine.getTaskService().claim(taskId, userId);
ps: 如果沒有顯示指定設定的是使用者還是群組, 引擎會預設當做群組處理。所以下面的設定與使用group(accountancy)效果一樣。
<formalExpression>accountancy</formalExpression>
3.Activiti對任務分配的擴充套件
當分配不復雜時,使用者和組的設定非常麻煩。 為避免複雜性,可以使用使用者任務的自定義擴充套件。
assignee屬性:這個自定義擴充套件可以直接把使用者任務分配給指定使用者。
<userTask id="theTask" name="my task" activiti:assignee="kermit" />
它和使用上面定義的humanPerformer 效果完全一樣。
candidateUsers屬性:這個自定義擴充套件可以為任務設定候選人。
<userTask id="theTask" name="my task" activiti:candidateUsers="kermit, gonzo" />
它和使用上面定義的potentialOwner 效果完全一樣。 注意它不需要像使用potentialOwner通過user(kermit)宣告, 因為這個屬性只能用於人員。
candidateGroups屬性:這個自定義擴充套件可以為任務設定候選組。
<userTask id="theTask" name="my task" activiti:candidateGroups="management, accountancy" />
ps:這三個屬性都可以通過流程變數動態指定值,多值需要用逗號隔開
4. 如果上面的方式還不滿足需求,還可以使用建立事件的任務監聽器 來實現自定義的分配邏輯:
<userTask id="task1" name="My task" >
<extensionElements>
<activiti:taskListener event="create" class="org.activiti.MyAssignmentHandler" />
</extensionElements>
</userTask>
DelegateTask會傳遞給TaskListener的實現, 通過它可以設定執行人,候選人和候選組:
public class MyAssignmentHandler implements TaskListener {
public void notify(DelegateTask delegateTask) {
// Execute custom identity lookups here
// and then for example call following methods:
delegateTask.setAssignee("kermit");
delegateTask.addCandidateUser("fozzie");
delegateTask.addCandidateGroup("management");
...
}
}
5. 使用spring時,可以使用表示式 把任務監聽器設定為spring代理的bean, 讓這個監聽器監聽任務的建立事件。
下面的例子中,執行者會通過呼叫ldapService這個spring bean的findManagerOfEmployee方法獲得。
流程變數emp會作為引數傳遞給bean。
<userTask id="task" name="My Task" activiti:assignee="${ldapService.findManagerForEmployee(emp)}"/>
也可以用來設定候選人和候選組:
<userTask id="task" name="My Task" activiti:candidateUsers="${ldapService.findAllSales()}"/>
ps:注意方法返回型別只能為String或Collection<String> (對應候選人和候選組):
public class FakeLdapService {
public String findManagerForEmployee(String employee) {
return "Kermit The Frog";
}
public List<String> findAllSales() {
return Arrays.asList("kermit", "gonzo", "fozzie");
}
}