flowable6.0-用户任务说明
用户任务
描述
“用户任务”用于对需要人工完成的工作进行建模。当流程执行到达此类用户任务时,会在分配给该任务的任何用户或组的任务列表中创建一个新任务。
图形符号
用户任务可视化为典型任务(圆角矩形),左上角有一个小用户图标。
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()
截止日期
每个任务都有一个字段,指示该任务的截止日期。Query API 可用于查询在给定日期之前、之前或之后到期的任务。
有一个活动扩展,允许您在任务定义中指定一个表达式,以在创建任务时设置其初始截止日期。该表达式应始终解析为 java.util.Date、java.util.String(ISO8601 格式)、ISO8601 时间持续时间(例如 PT50M)或 null。例如,您可以使用在流程中的先前表单中输入或在先前服务任务中计算的日期。如果使用时间持续时间,则截止日期将根据当前时间计算并按给定时间段递增。例如,当“PT30M”用作dueDate 时,任务将在30 分钟后到期。
<userTask id="theTask" name="Important task" flowable:dueDate="${dateVariable}"/>
也可以使用 TaskService 或使用传递的 DelegateTask 在 TaskListeners 中更改任务的截止日期。
用户分配
用户任务可以直接分配给用户。这是通过定义一个humanPerformer子元素来完成的。这样的humanPerformer定义需要一个实际定义用户的resourceAssignmentExpression。目前,仅支持正式表达式。
<process >...<userTask id='theTask' name='important task' ><humanPerformer><resourceAssignmentExpression><formalExpression>kermit</formalExpression></resourceAssignmentExpression></humanPerformer></userTask>
只能将一名用户指定为任务的人工执行者。在 Flowable 术语中,此用户称为受让人。具有受让人的任务在其他人的任务列表中不可见,而可以在受让人的个人任务列表中找到。
可以通过 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 是候选用户的所有任务,换句话说,正式表达式包含user(kermit)。这还将检索分配给 kermit 所属组的所有任务(例如,group(management),如果 kermit 是该组的成员并且使用 Flowable 身份组件)。用户组在运行时解析,可以通过IdentityService进行管理。
如果没有具体说明给定的文本字符串是用户还是组,则引擎默认为组。以下内容与声明 group(accountancy)时相同。
<formalExpression>accountancy</formalExpression>
任务分配的可流动扩展
很明显,对于分配不复杂的用例,用户和组分配非常麻烦。为了避免这些复杂性,可以对用户任务进行自定义扩展。
- 受让人属性:此自定义扩展允许将给定用户直接分配给任务。
<userTask id="theTask" name="my task" flowable:assignee="kermit" />
这与使用上述定义的humanPerformer构造完全相同。
- CandidateUsers 属性:此自定义扩展使给定用户成为任务的候选人。
<userTask id="theTask" name="my task" flowable:candidateUsers="kermit, gonzo" />
这与使用上面定义的potentialOwner构造完全相同。请注意,与潜在所有者构造的情况一样,没有必要使用user(kermit)声明,因为该属性只能用于用户。
- CandidateGroups 属性:此自定义扩展使给定组成为任务的候选者。
<userTask id="theTask" name="my task" flowable:candidateGroups="management, accountancy" />
这与使用上述定义的potentialOwner构造完全相同。请注意,没有必要使用group(management)声明,就像潜在所有者构造的情况一样,因为该属性只能用于组。
- CandidateUsers和CandidateGroups都可以定义在同一个用户任务上。
注意:虽然 Flowable 提供了一个身份管理组件,它通过IdentityService公开,但不检查身份组件是否知道提供的用户。这是为了允许 Flowable 在嵌入应用程序时与现有的身份管理解决方案集成。
自定义身份链接类型
BPMN 标准支持单个分配的用户或humanPerformer或一组用户,这些用户形成潜在的潜在所有者池,如用户分配中所定义。此外,Flowable为 User Task定义了扩展属性元素,可以表示任务受托人或候选所有者。
支持的 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 示例授权标识是user和group。如上一节所述,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";
}
通过任务侦听器自定义分配
如果前面的方法还不够,可以使用create 事件上的任务侦听器委托给自定义分配逻辑:
<userTask id="task1" name="My task" ><extensionElements><flowable:taskListener event="create" class="org.flowable.MyAssignmentHandler" /></extensionElements>
</userTask>
传递给 TaskListener 实现的 DelegateTask 可以设置受让人和候选用户/组:
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 。在以下示例中,将通过调用 ldapService Spring bean 上的 findManagerOfEmployee 来设置受让人。传递的emp参数是一个过程变量>。
<userTask id="task" name="My Task" flowable:assignee="${ldapService.findManagerForEmployee(emp)}"/>
这也适用于候选用户和组:
<userTask id="task" name="My Task" flowable:candidateUsers="${ldapService.findAllSales()}"/>
请注意,这仅在调用方法的返回类型为 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");}}
flowable6.0-用户任务说明相关推荐
- 工作流引擎添新丁:Flowable6.0发布
为什么80%的码农都做不了架构师?>>> 如果你在还纠结该选择JPMB还是Acitiviti的时候,或者还在纠结于是否该从JPMB迁移到Activiti的阵营中的时候,很不幸地 ...
- [转载]Guice 1.0 用户指南
http://code.google.com/p/google-guice/ 用 Guice 写 Java Guice 1.0 用户指南 (20070326 王咏刚 译自:http://docs.go ...
- android 7.0独立升级,爆料:Android 7.0用户将可自行升级!
原标题:爆料:Android 7.0用户将可自行升级! 谷歌:大家好,谷歌武林大会(I/O大会)将在美西时间5月18-20日召开,届时激动人心的Android 7.0就要来啦. 手机厂商:我了个擦,老 ...
- Discuz!6.1.0 用户密码如何加密的?
Discuz!6.1.0 用户密码是放在uc_members 表中的,cdb_members 表中的密码是随机放的,没有作用 用户的密码加密方式 $password 用户密码 $salt ...
- Guice 1.0 用户指南
http://code.google.com/p/google-guice/ 用 Guice 写 Java Guice 1.0 用户指南 (20070326 王咏刚 译自:http://docs.go ...
- SwiftUI3.0用户登录输入非空校验经典案例
SwiftUI3.0用户登录输入非空校验经典案例 在oc和swift里面,通过UITextFiled的代理方法,可以实施监听到用户输入的每个字符,使用正则表达式,进行判断,是否合法.在swiftUI通 ...
- Vue2.0用户权限控制解决方案
Vue2.0用户权限控制解决方案 参考文章: (1)Vue2.0用户权限控制解决方案 (2)https://www.cnblogs.com/zhumengke/articles/11526973.ht ...
- BlackHoleDAO能否点燃DeFi3.0用户激情
堪称DeFi3.0资产管理协议BlackHoleDAO最近在各大社区表现的很活跃,其目标是做一个DeFi领域的去中心化"灰度"资本,为散户提供服务. 首先大家要对资产管理有个基础认 ...
- ASP.NET 2.0用户管理数据库的注册
在ASP.NET 2.0中提供了许多新功能,这些功能都需要使用Provider提供对数据库的访问.通过Provider,不需要再编写ADO.NET去访问数据库,就可以进行用户.角色等的管理. 要使用. ...
- mysql8.0查看用户_MySQL 8.0用户及安全管理
主从复制 高可用 老版本开发工具 mysql> create user test1@'%' identified by '123456'; Query OK,0 rows affected (0 ...
最新文章
- html表格上下移动,Vue实现table上下移动功能示例
- FPGA之道(35)Verilog中的并行与串行语句
- make: *** [ext/fileinfo/libmagic/apprentice.lo] Er
- 深度学习概述:从感知机到深度网络
- 想成为一名优秀的数据分析师,应该做些什么?
- 数据库经典DB2在技术前沿展现王者风范
- nit计算机应用基础是考试大纲,NIT考试大纲--计算机应用基础.doc
- cass方格网数据excel_讨论|CASS怎么计算回字型土方? 124
- DA模拟量控制外接600V高压直流源-设计分析
- 今晚直播 | Oracle技术加油站:快速处理紧急性能问题的工具与经验
- BAPI_SALESDOCU_CREATEFROMDATA1--VA01
- 2.7、Spring Boot 异常处理体系
- AR VR或将彻底变革广告营销行业
- Matlab R2014a安装教程
- python游戏编程讲解之凯撒密码
- jdk1.8 64位 32位免费下载
- Jsoup爬虫小案例
- 普元EOS生成WebService时使用自定义实体映射属性
- 关系数据库——关系代数
- 基金指数温度怎么算_温度换算(指数基金温度计算器)
热门文章
- openwrt 开启软看门狗
- “中文问题没商量”之Ant中的中文问题
- 椭圆曲线加密(ECC)
- Clickhouse 分布式子查询——global in/join(慎用慎用)
- mysql 验证用户名重复,Ajax案例——检验用户名是否重复
- 密码学——elgama加解密及数字签名算法
- catia螺纹孔在二维图上不显示_请问Solidworks2018的螺纹孔我选中了装饰螺纹线,立体图里怎么没有显示螺纹线呢谢谢...
- 静态网页与动态网页的区别
- 计算机视觉——基于sift算法的地理信息图像匹配
- vue中 向一个数组中的每一个对象里添加一个属性