Flowable入门系列文章42 - 用户任务

1、描述

一个用户任务被用来模拟需要由人来完成的工作。当进程执行到达这样的用户任务时,在分配给该任务的任何用户或组的任务列表中创建新的任务。

2、图形表示法

用户任务可视化为一个典型的任务(圆角矩形),在左上角有一个小的用户图标。
在这里插入图片描述

3、XML表示

用户任务在XML中定义如下。该ID是必需的属性,在名称属性是可选的。

<userTask id="theTask" name="Important task" />

用户任务也可以有一个描述。实际上,任何BPMN 2.0元素都可以有一个描述。通过添加文档元素来定义描述。

<userTask id="theTask" name="Schedule meeting" >
<documentation>
	Schedule an engineering meeting for next week with the new hire.
</documentation>

描述文本可以用标准的Java方式从任务中获取:

 task.getDescription()

4、截止日期

每个任务都有一个字段,指出该任务的到期日期。查询API可用于查询在给定日期之前或之后到期的任务。

有一个活动扩展,允许您在任务定义中指定一个表达式来设置任务创建时的初始到期日期。表达应该总是解析为java.util.Date,java.util.String (ISO8601 formatted),ISO8601时间持续时间(例如,PT50M)或null。例如,您可以使用在过程中以前一个表单输入的日期,或在先前的服务任务中计算的日期。如果使用持续时间,则根据当前时间计算到期日,并按给定的时间段递增。例如,当“PT30M”被用作dueDate时,从现在起30分钟内完成任务。

<userTask id="theTask" name="Important task" flowable:dueDate="${dateVariable}"/>

任务的截止日期也可以通过使用TaskService或者TaskListener使用传递来改变DelegateTask。

5、用户分配

用户任务可以直接分配给用户。这是通过定义一个humanPerformer子元素来完成的。这样的一个humanPerformer定义需要一个实际定义用户的resourceAssignmentExpression。目前只支持formalExpressions。

<process >
...
<userTask id='theTask' name='important task' >
<humanPerformer>
<resourceAssignmentExpression>
<formalExpression>kermit</formalExpression>
</resourceAssignmentExpression>
</humanPerformer>
</userTask>

只有一个用户可以被分配作为任务的人员执行者。在流动术语中,这个用户被称为受让人。具有受让人的任务在其他人的任务列表中不可见,并且可以在受让人的个人任务列表中找到。

直接分配给用户的任务可以通过TaskService获取,如下所示:

 List<Task> tasks = taskService.createTaskQuery().taskAssignee("kermit").list();

任务也可以放在候选人的任务列表中。在这种情况下,必须使用potentialOwner结构。用法与humanPerformer构造类似。请注意,有必要
指定它是一个用户还是为正式表达式中的每个元素定义的组(引擎不能猜到这一点)。

<process >
...
<userTask id='theTask' name='important task' >
<potentialOwner>
<resourceAssignmentExpression>
<formalExpression>user(kermit), group(management)</formalExpression>
</resourceAssignmentExpression>
</potentialOwner>
</userTask>

使用潜在所有者构造定义的任务可以按照以下方式进行检索(或与受让人的任务类似的TaskQuery使用情况):

List<Task> tasks = taskService.createTaskQuery().taskCandidateUser("kermit");

这将检索kermit是候选用户的所有任务,换句话说,正式表达式包含用户(kermit)。如果kermit是该组的成员并且使用Flowable标识组件,
这也将检索分配给哪个kermit是其成员的组的所有任务(例如,组(管理))。用户的组在运行时解析,这些可以通过IdentityService进行
管理。

如果没有给出关于给定文本字符串是用户还是组的详细信息,则引擎默认为组。以下内容与宣布分组(会计)时相同。

<formalExpression>accountancy</formalExpression>

6、用于任务分配的流动扩展

很明显,用户和组的分配对于分配不复杂的用例是相当麻烦的。为了避免这些复杂性,用户任务上的自定义扩展是可能的。

  • 受让人属性:此自定义扩展允许将给定用户直接分配给任务。
<userTask id="theTask" name="my task" flowable:assignee="kermit" />

这与使用上面定义的humanPerformer构造完全相同。

  • candidateUsers属性:此自定义扩展使给定用户成为任务的候选人。
<userTask id="theTask" name="my task" flowable:candidateUsers="kermit, gonzo" />

这与使用上面定义的potentialOwner结构完全相同。请注意,与潜在所有者构造的情况一样,没有必要使用用户(kermit)声明,因为该属性只能用于用户。

  • candidateGroups属性:此自定义扩展使给定的组成为任务的候选人。
<userTask id="theTask" name="my task" flowable:candidateGroups="management, accountancy" />

这与使用上面定义的potentialOwner结构完全相同。请注意,与潜在所有者构造的情况一样,没有必要使用组(管理)声明,因为该属性只
能用于组。

  • candidateUsers和candidateGroups都可以在同一个用户任务上定义。

注意:尽管Flowable提供了通过IdentityService公开的身份管理组件,但不会检查身份组件是否知道提供的用户。这是为了让Flowable在嵌入应用程序时与现有的身份管理解决方案集成。

7、自定义标识链接类型

BPMN标准支持单个分配的用户或人员执行者或一组用户,这些用户构成潜在的潜在用户池,如用户分配中所定义。另外,Flowable定义了用户任务的扩展属性元素,可以代表任务的受让人或候选人。

受支持的Flowable标识链接类型是:

public class IdentityLinkType {
	/* Flowable native roles */
	public static final String ASSIGNEE = "assignee";
	public static final String CANDIDATE = "candidate";
	public static final String OWNER = "owner";
	public static final String STARTER = "starter";
	public static final String PARTICIPANT = "participant";
}

BPMN标准和Flowable示例授权标识是用户和组。如前一节所述,Flowable身份管理实现不适用于生产用途,但应根据所支持的授权方案进行扩展。

如果需要其他链接类型,则可以使用以下语法将自定义资源定义为扩展元素:

<userTask id="theTask" name="make profit">
<extensionElements>
<flowable:customResource flowable:name="businessAdministrator">
<resourceAssignmentExpression>
<formalExpression>user(kermit), group(management)</formalExpression>
</resourceAssignmentExpression>
</flowable:customResource>
</extensionElements>
</userTask>

自定义链接表达式被添加到TaskDefinition类中:

protected Map<String, Set<Expression>> customUserIdentityLinkExpressions =
        new HashMap<String, Set<Expression>>();
protected Map<String, Set<Expression>> customGroupIdentityLinkExpressions =
        new HashMap<String, Set<Expression>>();
public Map<String, Set<Expression>> getCustomUserIdentityLinkExpressions() {
        return customUserIdentityLinkExpressions;
        }
public void addCustomUserIdentityLinkExpression(
        String identityLinkType, Set<Expression> idList) {
        customUserIdentityLinkExpressions.put(identityLinkType, idList);
        }
public Map<String, Set<Expression>> getCustomGroupIdentityLinkExpressions() {
        return customGroupIdentityLinkExpressions;
        }
public void addCustomGroupIdentityLinkExpression(
        String identityLinkType, Set<Expression> idList) {
        customGroupIdentityLinkExpressions.put(identityLinkType, idList);
        }

这些由UserTaskActivityBehavior handleAssignments方法在运行时填充。

最后,IdentityLinkType类必须扩展以支持自定义标识链接类型:

package com.yourco.engine.task;
public class IdentityLinkType extends org.flowable.engine.task.IdentityLinkType {
	public static final String ADMINISTRATOR = "administrator";
	public static final String EXCLUDED_OWNER = "excludedOwner";
}

8、通过任务监听器自定义分配

如果以前的方法不够,可以使用任务监听器在create事件上委托给自定义赋值逻辑:

<userTask id="task1" name="My task" >
<extensionElements>
<flowable:taskListener event="create" class="org.flowable.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");
		...
	}
}

在使用Spring时,可以使用上面介绍的自定义赋值属性,并使用具有侦听任务创建事件的表达式的任务侦听器委托给Spring bean 。在下面的例子中,受让人将通过调用设置上的Spring bean。传递的emp参数是一个过程变量>。findManagerOfEmployeeldapService

<userTask id="task" name="My Task" flowable:assignee="${ldapService.findManagerForEmployee(emp)}"/>

对于候选用户和组也同样适用:

<userTask id="task" name="My Task" flowable:candidateUsers="${ldapService.findAllSales()}"/>

请注意,只有被调用的方法的返回类型是String或Collection(对于候选用户和组),这才会起作用:

public class FakeLdapService {
	public String findManagerForEmployee(String employee) {
		return "Kermit The Frog";
	}
	public List<String> findAllSales() {
		return Arrays.asList("kermit", "gonzo", "fozzie");
	}
}

上面文章来自盘古BPM研究院:http://vue.pangubpm.com/
文章翻译提交:https://github.com/qiudaoke/flowable-userguide
了解更多文章可以关注微信公众号:
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值