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
了解更多文章可以关注微信公众号:
Flowable入门系列文章42 - 用户任务相关推荐
- Flowable入门系列文章62 - 异步延续
Flowable以交易方式执行流程,可以根据需要进行配置.我们先看看Flowable如何正常地处理事务.如果触发Flowable(启动一个进程,完 成一个任务,发出执行信号),Flowable将在进程 ...
- Flowable入门系列文章193 - 禁用批量插入和安全脚本
1.禁用批量插入 默认情况下,引擎将在批量插入中将同一数据库表的多个插入语句组合在一起,从而提高性能.已经针对所有支持的数据库进行了测试和实施. 但是,它可能是受支持和测试过的数据库的特定版本,不允许 ...
- Flowable入门系列文章25 - Activity解读 01
事件被用来模拟流程生命周期中发生的事情.事件总是被视为一个圆圈.在BPMN 2.0中,存在两个主要事件类别:捕捉事件和抛出事件. 捕捉:当进程执行到达事件时,它将等待触发器发生.触发器的类型由XML中 ...
- Flowable入门系列文章11 - Flowable API 01
1.Process Engine API和服务 引擎API是与Flowable进行交互的最常见的方式.主要的出发点是ProcessEngine,可以按照配置部分所述的几种方式创建 .从 Process ...
- Flowable入门系列文章86 - Flowable Modeler应用程序
Flowable Modeler应用程序可用于对BPMN流程,DMN决策表,表单定义和创建应用程序定义进行建模.BPMN建模人员使用与Flowable 5 中相同的Oryx和Angular基础,但是现 ...
- Flowable入门系列文章47 - 电子邮件任务
Flowable允许您通过向一个或多个收件人发送电子邮件的自动邮件服务任务来增强业务流程,包括支持cc,bcc,HTML内容等.请注意,邮件任务不是 BPMN 2.0规范的正式任务(因此没有专门的图标 ...
- Flowable入门系列文章195 - JMX的组态和服务URL
1.组态 JMX使用默认配置,以便于使用最常用的配置进行部署.但是,更改默认配置很容易.您可以通过编程或通过配置文件来完成.下面的代码片段显示了如何在配置文件中完成这个工作: <bean id= ...
- Flowable入门系列文章35 - Activity解读 11
1.消息中间捕捉事件 描述 中间捕获 消息事件捕获具有指定名称的消息. 图形表示法 中间捕捉消息事件可视化为一个典型的中间事件(圆圈内有较小的圆圈),里面有消息图标.消息图标是白色(未填充),以指示其 ...
- Flowable入门系列文章194 - JMX的基本介绍和属性说明
1.介绍 可以使用标准的Java管理扩展(JMX)技术连接到Flowable引擎,以获取信息或更改其行为.任何标准的JMX客户端都可以用于这个目的.启用和禁用Job Executor,部署新的流程定义 ...
最新文章
- 只有ajax会跨域吗_ajax处理跨域有几种方式
- 《JavaScript高级程序设计》节点层次和DOM操作技术
- 【自动驾驶/opencv】32.交通灯颜色提取的难点
- Andriod --- JetPack (七):Room + ViewModel + LiveData 增删改查实例
- c++备考期末必看知识点(一篇就够了)
- php点菜系统开题报告,点餐管理系统的设计与实现-开题报告
- java程序中可以有几个构造方法_java中多个构造方法可以相互引用么?
- 解决IDEA2020控制台乱码的方法(亲测)
- Java LocalDate类| getChronology()方法与示例
- Opencv--warpPerspective +remap结合
- studio one 3 机架声道设置_「声卡跳线」IXI Mega M8 声卡电脑/手机直播机架跳线(图文教程)...
- 正则表达式常用匹配方式
- DirectX SDK 各版本开发包下载地址合集
- Magento(CE1.X)自带模块解析七
- Vant Webapp步骤表单
- 采购员的主要职责是什么?
- 坚持写博客以来的感受和改变
- PiXYZ Studio教程
- golang map的遍历
- 天猫京东凡客 简析三类B2C模式
热门文章
- 使用.reg文件操作注册编辑表
- Python Numpy 关于 linspace()函数 使用详解(全)
- cx_Oracle.DatabaseError: DPI-1047: Cannot locate a 64-bit O
- 地图经纬度纠偏-所有高德系地图纠偏
- python3.6 爬取淘宝评论(大衣+内衣)
- idea输出中文乱码
- redis密码、端口号、连接IP的修改
- 公差配合及检测技术实用图表
- 开发编码格式_编码和游戏开发
- phpstorm2018版激活办法,2018/5/28实锤有效