目前最新版的Flowable6.4,与旧版或Activiti有些许区别。由于关于Flowable的文章比较稀缺,遇到不少坑,特此记录。
参考文章:http://huan1993.iteye.com/blog/2249764
第一部分是部署文件的大致说明,其他文章也有介绍,熟悉的可以跳过

  1. 首先部署文件中:
<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值。

  1. 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 多实例会签 审批人设置、结果判断、会签后走向相关推荐

  1. linux数据库实例开机启动不了,linux下Oracle数据库实例开机自启动设置

    linux下数据库实例开机自启动设置 1.改动/oratab [root@org54 ~]# vi/etc/oratab     --把N改为Y,例如以下提示 # This file is used ...

  2. linux数据库实例开机启动,linux下数据库实例开机自启动设置

    linux下数据库实例开机自启动设置 1.修改/oratab [root@org54 ~]# vi/etc/oratab --把N改为Y,如下提示 # This file is used by ORA ...

  3. linux数据库实例开机启动,Oracle数据库之Linux下实现Oracle数据库单实例开机自启动设置...

    本文主要向大家介绍了Oracle数据库之Linux下实现Oracle数据库单实例开机自启动设置,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助. 步骤思路: 1:查看ORACLE_ ...

  4. java设置子线程优先级_Java 实例 - 线程优先级设置

    Java 实例 - 线程优先级设置 以下实例演示了如何通过setPriority() 方法来设置线程的优先级: SimplePriorities.java 文件 public class Simple ...

  5. java连接sqlserver非默认实例连接字符串设置

    找了很多天关于jtds连接池的连接非sqlserver默认实例的方法终于找到了,因为部署程序的时候服务器的sqlserver2008不是r2但是数据库备份的是r2还原不到里面,所以第一个办法就是升级到 ...

  6. 会签是什么,何时使用会签,如何设计使用会签

    一.会签 1.1会签定义 会签用于与本次审核内容相关的各有关部门进行协商并核签,简单地讲就是多方共同签署,对签字内容进行确认并签字,签字就意味着要负责.要为确认内容承担责任. 1.2会签与加签 会签是 ...

  7. 设置 核心内存转储后无效_从内存转储的第1部分(共3部分)调查无效的程序异常

    设置 核心内存转储后无效 Datadog automated instrumentation for .NET works by rewriting the IL of interesting met ...

  8. js 设置当前时间的后20分钟、后一小时、前一天等等相对时间

    不管是设置相对当前时间有多久时间差的时间,统一思路为:先获取当前时间的时间戳,再根据需求加减时间获得新的时间戳,然后取年月日与时分秒.实例如下: // 设置默认时间--先转化为毫秒数,加上 20 分钟 ...

  9. R语言ggplot2可视化:通过在element_text函数中设置ifelse判断条件自定义标签文本的显示格式:例如、粗体、斜体等

    R语言ggplot2可视化:通过在element_text函数中设置ifelse判断条件自定义标签文本的显示格式:例如.粗体.斜体等 目录

最新文章

  1. Algs4-1.1.21打印表格
  2. 移动端通过ajax上传图片(文件)并在前台展示——通过H5的FormData对象
  3. oracle 查询所有组合,Oracle的组合条件查询
  4. javascript+div实现鼠标划过,切换层效果
  5. 矩阵范数的等价性(原创)
  6. 树莓派做BT下载器:transmission
  7. 什么是MBR/DPT/DBR/BPB?
  8. gtk3基础知识的学习(C语言)
  9. win10更换自己喜欢的鼠标样式,马里奥、wow、lol都可以哦
  10. JDK-8274609 JEP 421: Deprecate Finalization for Removal
  11. JavaScript改变图片大小
  12. VBS 从Excel中获取数据,批量替换word中的文字
  13. 爱快软路由+panabit上网行为管理
  14. String类型的测量长度
  15. ui-bootstrap-tpls 中文 现在还不全的啊~,组件太多了,有空就更新
  16. python非技术面试题宝典
  17. 推荐电影:亚当桑德勒的《我盛大的同志婚礼》
  18. 用Python爬取王者农药英雄皮肤 原
  19. C语言完整代码实现:二叉树的先序遍历、中序遍历、后序遍历
  20. 在iphone、ipad上安装一些常用命令行命令及实时抓取移动设备上的通信包(ADVsock2pipe+Wireshark+nc+tcpdump)

热门文章

  1. CentOS7.9安装rsyslog+loganalyzer日志服务器详细配置
  2. 程序员卷起来,35岁怎么惨,但怎么还这么多钱?
  3. 0812Python总结-网络编程相关知识
  4. #define(1)define常用操作
  5. 不会这4个Excel技巧,怎么敢说自己精通表格软件?
  6. 中国绝美情诗名句排行榜TOP100
  7. css:定位部分以及相关拓展知识
  8. 人生有时候,总是很讽刺
  9. mysql自定义函数分组_mysql中的排序和分组及分组函数
  10. iOS开发 - 检测网络状态(WIFI、2G/3G/4G)