[转]activiti5用户任务分配

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

}
时间: 2024-10-06 02:24:52

[转]activiti5用户任务分配的相关文章

Activiti用户任务分配

一.前言 上篇博文<浅谈Activiti工作流引擎用户管理>中已介绍了如何自定义自己的用户管理模块.然而困恼大多数新手的另一个问题:如何将任务分配给有层级关系的组织结构用户呢?例如,我只想把任务分配给我上级部门的领导审批,而上级部门的任务又只分配给指定的上级审批.而按Activiti的用户(user).组(group)来平级关系来操作的话,则需要设计多个组.多个配置来实现,这显然不合适. 二.需求分析    一般公司的组织结构: 再看看我项目中的部分审批流程截图: 所以,我申请人的申请当然是给

智能家居系统-软件设计

1 智能家居远程控制系统的软件实现 1.1 基于uC/OS-II的中央控制器的软件设计 1.1.1 uC/OS-II系统移植 本设计使用uC/OS-II操作系统,uC/OS-II是一个源码公开.可移植.可固化.可剪裁和抢占式的实时多任务操作系统,uC/OS-II的大部分源码是用标准ANSI C编写,并且编程规范,可读性很高,内核中只有少量的与硬件相关的代码使用汇编语言编写,总共200余行,移植非常方便[37].uC/OS-II软件体系结构如图5-1所示.移植工作主要包括以下几个方面的内容: 1)

通向高可扩展性之路(谷歌篇)

原文链接:http://highscalability.com/google-architecture 原文写于2008年11月22日,以下是译文: 平台: 1. Linux 2. 很多种语言: Python, Java, C++ 平台上有什么? 一些数据: 1. 2006年时大约有450,000 台廉价商用服务器 2. 2005年的时候谷歌已经索引了80亿网页.现在大概没人知道他们以及索引了多少网页了. 3. 现在谷歌有超过200个GFS集群.一个集群可以有1000甚至5000台机器.成千上万

云计算安全解决方案白皮书(一)

云计算安全解决方案白皮书 Jack zhai 研究云的安全有两三年了,但形成完整的安全思路,还是去年的事,这也是"流安全"思路形成的主要阶段. 云计算的安全问题之所以突出,是因为虚拟机的动态迁移,以及多业务系统交织在一起,这让传统的网卡边界就是安全部署点的方法不在适用.流安全不再关注被保护服务器的物理位置,转而关注访问该服务器的数据流.通过对数据流的重新"路由",保证对数据流的安全清洗,从而实现对服务器的网络保护.在访问控制模型中,有一类流模型,就是针对数据流进行保

基于Activiti5.15.1 自定义用户、组(User,Group)实现

基于Activiti5.15.1 自定义用户.组(User,Group)实现 本人刚接触Activiti,最近工作中需要将Activiti中原有的用户,组(ACT_ID_USER,ACT_ID_GROUP,ACT_ID_MEMBERSHIP)表替换为公司已有的相关表.查看了咖啡兔及论坛相关文章.今天有空整理一下.以帮助后续有此需要的初学者. 自定义Group,User工厂类,实现SessionFactory接口 1)CustomGroupEntityManagerFactory @Service

activiti5.13 框架 数据库设计说明书

转载自:http://www.cnblogs.com/llzgzljl/p/3356108.html activiti5.13 框架 数据库设计说明书 1.结构设计 1.1.    逻辑结构设计 Activiti使用到的表都是ACT_开头的. ACT_RE_*: ’RE’表示repository(存储),RepositoryService接口所操作的表.带此前缀的表包含的是静态信息,如,流程定义,流程的资源(图片,规则等). ACT_RU_*: ‘RU’表示runtime,运行时表-Runtim

MapReduce剖析笔记之五:Map与Reduce任务分配过程

在上一节分析了TaskTracker和JobTracker之间通过周期的心跳消息获取任务分配结果的过程.中间留了一个问题,就是任务到底是怎么分配的.任务的分配自然是由JobTracker做出来的,具体来说,存在一个抽象类:TaskScheduler,主要负责分配任务,继承该类的有几个类: CapacityTaskScheduler.FairScheduler.JobQueueTaskScheduler(LimitTasksPerJobTaskScheduler又继承于该类). 从名字大致可以看出

jbpm的智能选择审批人及人工任务分配的实现思路

一.jbpm中审批人的概念 在工作流中每一个人工任务的办理者被称作审批人,在原生的jbpm定义中,我们可以看到assignee和assignmentHandler这两个标签. <task name="review" g="96,16,127,52">       <assignment-handler class="org.jbpm.examples.task.assignmenthandler.AssignTask"> 

BPMN2新规范与Activiti5

上世纪九十年代以后,随着WfMC联盟的成立,BPM市场群雄逐鹿如火如荼,工作流技术得到了突飞猛进的发展,其中IBM.Oracle等大型软件厂商在工作流领域各扯大旗割据一方.2011年BPMN2.0新规范的发布为各工作流产品互容互通提供了统一的标准,结束了各工作流厂商各自为政相互抵斥的局面. 什么是BPMN.Workflow? BPM(Business Process Management)——“通过建模.自动化.管理和优化流程,打破跨部门跨系统业务过程依赖,提高业务效率和效果”. Workflo