Flowable 6.4 多实例会签 审批人设置、结果判断、会签后走向
目前最新版的Flowable6.4,与旧版或Activiti有些许区别。由于关于Flowable的文章比较稀缺,遇到不少坑,特此记录。
参考文章:http://huan1993.iteye.com/blog/2249764
第一部分是部署文件的大致说明,其他文章也有介绍,熟悉的可以跳过
- 首先部署文件中:
<userTask id="_7" name="评估" flowable:assignee="${per}"><extensionElements><flowable:taskListener event="complete" class="com.taikang.sorceress.modules.workflow.listener.IdeaTaskListener"></flowable:taskListener><modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete></extensionElements><multiInstanceLoopCharacteristics isSequential="false" flowable:collection="pers" flowable:elementVariable="per"><completionCondition>${multiInstance.accessCondition(execution)}</completionCondition></multiInstanceLoopCharacteristics>
</userTask>
userTask标签中 ,flowable:assignee 表示取得multiInstanceLoopCharacteristics标签中flowable:elementVariable的值,而flowable:elementVariable的值表示flowable:collection这个审批人集合变量的每一个审批人变量;
extensionElements标签中,设置的是绑定的TaskListener;
multiInstanceLoopCharacteristics 标签中,设置的是多实例特点,其中:
isSequential属性表示是否串行,串行也就是说是否按顺序挨个儿执行。
flowable:collection是在上一个任务节点中放在map里的key值。
- ExecutionListener和TaskListener以及多实例任务结束条件类
下面说一下多实例任务的分配人环节以及结束条件部分。
分配人可以像其他文章一样使用ServiceTask读取上个节点存储的审批人。我是觉得必要性不大,直接在上个任务节点把审批人的集合存到map里完成任务即可。
map.put(“pers”, Arrays.asList(pers_arr));
taskService.complete(taskId, map);
类似于这样。注意map的key和部署文件中flowable:collection的值相同即可。
然后说一下多实例任务结束条件判定部分的坑。我当时看其他文章一直不明白为什么有了结束条件类还要绑TaskListener类,同样都可以用作监听完成任务之后的回调。
关键就在于ExecutionListener与TaskListener的可复写方法notify。这个方法的参数是DelegateExecution与DelegateTask。这两个类官方API的解释是 used in JavaDelegates and ExecutionListeners以及used in JavaDelegates and DelegateListeners。而JavaDelegates是用ServiceTask分配审批人的方式,是直接在DelegateExecution的变量调用setVariable方法设置审批人的。
这两种设置审批人的方法其实都是设置在了多实例任务所处的execution里的,所以均可。
区别在于多实例任务每次每个审批人comlete了之后。
首先说一下调用顺序,当taskService.complete(taskId, map)调用完之后,如果TaskListener的监听事件设置为comlete,那么这里会先触发TaskListener中的notify方法,之后再触发结束条件类的自定义结束函数。并且多实例任务中每次complete了之后都会顺序触发这两个类中的回调函数。
这是我的结束条件判断类:
public class MultiInstanceCompleteTask implements Serializable {/*** 评估结果判定条件* @param execution 分配执行实例*/public boolean accessCondition(DelegateExecution execution){//已完成的实例数int completedInstance = (int)execution.getVariable("nrOfCompletedInstances");//否决判断,一票否决if (execution.getVariable(“reject”) != null){int rejectCount = (int)execution.getVariable(“reject”);if(rejectCount > 0 ){//输出方向为拒绝execution.setVariable("outcome", “reject”);//一票否决其他实例没必要做,结束return true;}}//所有实例任务未全部做完则继续其他实例任务if(completedInstance != sum){return false;}else{//输出方向为赞同execution.setVariable("outcome",“approved”);//所有都做完了没被否决,结束return true;}}
我部署文件代码中multiInstance.accessCondition(execution)对应的便是此处。其中的mulitiInstance如果是和spring整合了,就是spring管理的bean的id,否则就是流程变量的key。
我遇到的坑在于无论你在多实例任务调用taskService.complete(taskId, map)之前往map里存了什么,在这个结束条件类里都是取不到的。
原因在于这里的回调参数是DelegateExecution类,是整体多实例任务的环境,在执行其中一个任务时是取不到的。
可以取到的类是DelegateTask类,所以我们每个实例的执行结果处理,应写在TaskListener类中,而结束条件类用作对TaskListener中的处理结果(包括各种结果的计数等)进行判断,然后在DelegateExecution的变量中设置输出方向是通过还是驳回等。这里判断函数的返回时是个boolean,它表示整个多实例任务节点是否结束,结束的意思是再进行下一个或其他多实例任务,还是将其他多实例任务短路掉直接结束,根据方法中setVariable中的值决定之后走向。也就是说boolean不代表接受或驳回,而是代表多实例任务节点是否提前结束。
另外计数变量的初值应在多实例任务节点钱的连线上绑定的ExecutionListener中设置,因为这才能作用于整个多实例任务。如果你在执行多实例任务中的某一个时是取不到的。代码如下:
public class IdeaExecutionListener implements ExecutionListener {@Overridepublic void notify(DelegateExecution delegateExecution) {delegateExecution.setVariable("unrelated",0);delegateExecution.setVariable("rejected",0);}
}
TaskListener示例
public class IdeaTaskListener implements TaskListener {@Overridepublic void notify(DelegateTask delegateTask) {//result的值为控制类中taskService.complete(taskId, map)时,map中所设String result = (String) delegateTask.getVariable("result");//ExecutionListner类中设置的拒绝计数变量int rejectedCount = (int)delegateTask.getVariable(“reject”);if(“reject”.equals(result)){//拒绝delegateTask.setVariable("rejected", ++rejectedCount);}}
另附判断结果类中流程引擎自带可用变量:
1.nrOfInstances 该会签环节中总共有多少个实例
2.nrOfActiveInstances 当前活动的实例的数量,即还没有 完成的实例数量。
3.nrOfCompletedInstances 已经完成的实例的数量
新手第一次写博文,哪里写的有误或者不足的地方,请各位大佬多多指教。也欢迎大家咨询相关问题!
Flowable 6.4 多实例会签 审批人设置、结果判断、会签后走向相关推荐
- linux数据库实例开机启动不了,linux下Oracle数据库实例开机自启动设置
linux下数据库实例开机自启动设置 1.改动/oratab [root@org54 ~]# vi/etc/oratab --把N改为Y,例如以下提示 # This file is used ...
- linux数据库实例开机启动,linux下数据库实例开机自启动设置
linux下数据库实例开机自启动设置 1.修改/oratab [root@org54 ~]# vi/etc/oratab --把N改为Y,如下提示 # This file is used by ORA ...
- linux数据库实例开机启动,Oracle数据库之Linux下实现Oracle数据库单实例开机自启动设置...
本文主要向大家介绍了Oracle数据库之Linux下实现Oracle数据库单实例开机自启动设置,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助. 步骤思路: 1:查看ORACLE_ ...
- java设置子线程优先级_Java 实例 - 线程优先级设置
Java 实例 - 线程优先级设置 以下实例演示了如何通过setPriority() 方法来设置线程的优先级: SimplePriorities.java 文件 public class Simple ...
- java连接sqlserver非默认实例连接字符串设置
找了很多天关于jtds连接池的连接非sqlserver默认实例的方法终于找到了,因为部署程序的时候服务器的sqlserver2008不是r2但是数据库备份的是r2还原不到里面,所以第一个办法就是升级到 ...
- 会签是什么,何时使用会签,如何设计使用会签
一.会签 1.1会签定义 会签用于与本次审核内容相关的各有关部门进行协商并核签,简单地讲就是多方共同签署,对签字内容进行确认并签字,签字就意味着要负责.要为确认内容承担责任. 1.2会签与加签 会签是 ...
- 设置 核心内存转储后无效_从内存转储的第1部分(共3部分)调查无效的程序异常
设置 核心内存转储后无效 Datadog automated instrumentation for .NET works by rewriting the IL of interesting met ...
- js 设置当前时间的后20分钟、后一小时、前一天等等相对时间
不管是设置相对当前时间有多久时间差的时间,统一思路为:先获取当前时间的时间戳,再根据需求加减时间获得新的时间戳,然后取年月日与时分秒.实例如下: // 设置默认时间--先转化为毫秒数,加上 20 分钟 ...
- R语言ggplot2可视化:通过在element_text函数中设置ifelse判断条件自定义标签文本的显示格式:例如、粗体、斜体等
R语言ggplot2可视化:通过在element_text函数中设置ifelse判断条件自定义标签文本的显示格式:例如.粗体.斜体等 目录
最新文章
- Algs4-1.1.21打印表格
- 移动端通过ajax上传图片(文件)并在前台展示——通过H5的FormData对象
- oracle 查询所有组合,Oracle的组合条件查询
- javascript+div实现鼠标划过,切换层效果
- 矩阵范数的等价性(原创)
- 树莓派做BT下载器:transmission
- 什么是MBR/DPT/DBR/BPB?
- gtk3基础知识的学习(C语言)
- win10更换自己喜欢的鼠标样式,马里奥、wow、lol都可以哦
- JDK-8274609 JEP 421: Deprecate Finalization for Removal
- JavaScript改变图片大小
- VBS 从Excel中获取数据,批量替换word中的文字
- 爱快软路由+panabit上网行为管理
- String类型的测量长度
- ui-bootstrap-tpls 中文 现在还不全的啊~,组件太多了,有空就更新
- python非技术面试题宝典
- 推荐电影:亚当桑德勒的《我盛大的同志婚礼》
- 用Python爬取王者农药英雄皮肤 原
- C语言完整代码实现:二叉树的先序遍历、中序遍历、后序遍历
- 在iphone、ipad上安装一些常用命令行命令及实时抓取移动设备上的通信包(ADVsock2pipe+Wireshark+nc+tcpdump)