用户任务分配办理人:
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");
} }

最新文章

  1. Eos开发——构造查询条件
  2. CMA-ES 算法
  3. 剖析JavaScript函数作用域与闭包
  4. phpcmsv9 幻灯片管理模块_UTF8
  5. 网页播放音频、视频文件——基于web的html 5的音乐播放器(转载)
  6. 蓝桥杯-组素数-java
  7. 自定义SpringBoot启动banner
  8. pip安装scrapy失败:twisted安装失败 error: Microsoft Visual C++ 14.0 is required.. 解决方法
  9. L - Non-Prime Factors (质数筛选+因子分解)
  10. C++版 - 剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题,ZOJ 1088:System Overload类似)题解
  11. Python 输出
  12. eclipse调试的时候怎么后退?
  13. Json格式循环遍历,Json数组循环遍历
  14. spring batch初识
  15. centos7.2 源码编译安装php7.2.4 apache2.4.37 https证书安装
  16. 八皇后 递归or迭代
  17. [NOIp2016]蚯蚓 (队列)
  18. iOS成长之路-使用系统默认声音、震动
  19. spark on yarn(zookeeper 配置)
  20. 性能测试工具Jmeter13-Jmeter跨线程组调用token

热门文章

  1. 指令中 controller &amp;&amp; controllerAs
  2. 轻松实现HTML5时钟(分享下自己对canvas的理解,原来没你想像的那么难哦)
  3. 在CentOS 7下试验Drupal 7
  4. nginx+keepalived+tomcat之具体配置档
  5. WSGI的理解
  6. linux下mysql忘记root密码的解决方案
  7. 大规模集群FTP代理(基于lvs的vsftpd网络负载均衡方案部署(PASV))
  8. C语言的本质(34)——静态库
  9. 一次使用Eclipse Memory Analyzer分析Tomcat内存溢出
  10. Plus One 解答