Flowable 6.4 多实例会签 审批人设置、结果判断、会签后走向

目前最新版的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 {

    @Override
    public void notify(DelegateExecution delegateExecution) {
        delegateExecution.setVariable("unrelated",0);
        delegateExecution.setVariable("rejected",0);
    }
}

TaskListener示例

public class IdeaTaskListener implements TaskListener {
    @Override
    public 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 已经完成的实例的数量

新手第一次写博文,哪里写的有误或者不足的地方,请各位大佬多多指教。也欢迎大家咨询相关问题!

  • 8
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
回答: Flowable中的多实例会签是一种任务分配和审批的机制,可以将一个任务分配给多个人执行,并根据设定的条件来确定任务的完成情况。在Flowable中,多实例会签的配置包括以下几个方面:[1][2][3] 1. userTask节点: 在流程定义中,使用userTask节点来定义多实例会签任务。可以通过设置assignee属性来指定任务的执行人,也可以通过设置assigneeList属性来指定任务的执行人列表。 2. multiInstanceLoopCharacteristics节点: 在userTask节点中,使用multiInstanceLoopCharacteristics节点来配置多实例会签的相关属性。其中,isSequential属性用于指定任务的执行方式,如果设置为false,则表示并行执行;如果设置为true,则表示串行执行。loopCardinality属性用于指定任务的实例数量,即要将任务分配给多少个人执行。elementVariable属性用于指定任务实例的变量名。 3. completionCondition: 在multiInstanceLoopCharacteristics节点中,可以使用completionCondition属性来设置任务的完成条件。可以使用表达式来定义完成条件,比如通过nrOfCompletedInstances和nrOfInstances来计算已完成的任务实例数量和总任务实例数量的比例,从而确定任务的完成情况。 总结起来,Flowable中的多实例会签是一种灵活的任务分配和审批机制,可以根据具体需求配置任务的执行方式、执行人和完成条件,以实现多人参与的任务审批过程。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值