Flowable工作流之任务回退

本文详细探讨了Flowable工作流中的任务回退,包括串行和并行任务的回退操作。通过实例展示了如何在不同场景下进行任务回退,并分析了回退过程中的关键步骤和数据变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 前言

有的时候,一个任务节点会存在多个候选人,例如 zhangsan 提交一个任务,这个任务既可以 lisi 处理,又可以 wangwu 处理,当一个候选人认领任务之后,但是又不想处理任务了,此时我们可以将任务回退,那么针对这种情况,我们该如何处理?今天一起来看看

2. Flowable 中的任务回退

2.1. 串行的回退

2.1.1. 流程图

我们先从最简单的串行流程来分析,案例流程图如下

在这里插入图片描述
完整的 xml 文件内容

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:flowable="http://flowable.org/bpmn"
             xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
             xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI"
             typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath"
             targetNamespace="http://www.flowable.org/processdef" exporter="Flowable Open Source Modeler"
             exporterVersion="6.7.2">
    <process id="TaskFallback" name="TaskFallback" isExecutable="true">
        <documentation>flowable中任务的回退</documentation>
        <startEvent id="sid-28824261-2B78-4304-A8A5-3C16F52D9797" flowable:formFieldValidation="true"></startEvent>
        <userTask id="userTaskId1" name="用户任务1" flowable:assignee="${user1}" flowable:formFieldValidation="true">
            <extensionElements>
                <modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler">
                    <![CDATA[false]]></modeler:initiator-can-complete>
            </extensionElements>
        </userTask>
        <sequenceFlow id="sid-600A5337-2246-4AD7-A042-0936186F4327" sourceRef="sid-28824261-2B78-4304-A8A5-3C16F52D9797"
                      targetRef="userTaskId1"></sequenceFlow>
        <userTask id="userTaskId2" name="用户任务2" flowable:assignee="${user2}" flowable:formFieldValidation="true">
            <extensionElements>
                <modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler">
                    <![CDATA[false]]></modeler:initiator-can-complete>
            </extensionElements>
        </userTask>
        <sequenceFlow id="sid-A816C5B2-796D-49AB-A5BB-18D3A59809A2" sourceRef="userTaskId1"
                      targetRef="userTaskId2"></sequenceFlow>
        <userTask id="userTaskId3" name="用户任务3" flowable:assignee="${user3}" flowable:formFieldValidation="true">
            <extensionElements>
                <modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler">
                    <![CDATA[false]]></modeler:initiator-can-complete>
            </extensionElements>
        </userTask>
        <sequenceFlow id="sid-A5EE9D1F-5B60-4741-9CBA-3450BCD79851" sourceRef="userTaskId2"
                      targetRef="userTaskId3"></sequenceFlow>
        <userTask id="userTaskId4" name="用户任务4" flowable:assignee="${user4}" flowable:formFieldValidation="true">
            <extensionElements>
                <modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler">
                    <![CDATA[false]]></modeler:initiator-can-complete>
            </extensionElements>
        </userTask>
        <sequenceFlow id="sid-62FCA0CF-0A6F-4A81-BE80-85B251DE7E40" sourceRef="userTaskId3"
                      targetRef="userTaskId4"></sequenceFlow>
        <endEvent id="sid-D326808D-3133-4907-84B4-1B6CE14EACF7"></endEvent>
        <sequenceFlow id="sid-E025FC2C-2857-4377-9D87-37FCC68C6781" sourceRef="userTaskId4"
                      targetRef="sid-D326808D-3133-4907-84B4-1B6CE14EACF7"></sequenceFlow>
    </process>
    <bpmndi:BPMNDiagram id="BPMNDiagram_TaskFallback">
        <bpmndi:BPMNPlane bpmnElement="TaskFallback" id="BPMNPlane_TaskFallback">
            <bpmndi:BPMNShape bpmnElement="sid-28824261-2B78-4304-A8A5-3C16F52D9797"
                              id="BPMNShape_sid-28824261-2B78-4304-A8A5-3C16F52D9797">
                <omgdc:Bounds height="30.0" width="30.0" x="38.0" y="108.0"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape bpmnElement="userTaskId1" id="BPMNShape_userTaskId1">
                <omgdc:Bounds height="80.0" width="100.0" x="135.0" y="83.0"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape bpmnElement="userTaskId2" id="BPMNShape_userTaskId2">
                <omgdc:Bounds height="80.0" width="100.0" x="315.0" y="83.0"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape bpmnElement="userTaskId3" id="BPMNShape_userTaskId3">
                <omgdc:Bounds height="80.0" width="100.0" x="495.0" y="83.0"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape bpmnElement="userTaskId4" id="BPMNShape_userTaskId4">
                <omgdc:Bounds height="80.0" width="100.0" x="675.0" y="83.0"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape bpmnElement="sid-D326808D-3133-4907-84B4-1B6CE14EACF7"
                              id="BPMNShape_sid-D326808D-3133-4907-84B4-1B6CE14EACF7">
                <omgdc:Bounds height="28.0" width="28.0" x="855.0" y="109.0"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNEdge bpmnElement="sid-600A5337-2246-4AD7-A042-0936186F4327"
                             id="BPMNEdge_sid-600A5337-2246-4AD7-A042-0936186F4327" flowable:sourceDockerX="15.0"
                             flowable:sourceDockerY="15.0" flowable:targetDockerX="50.0" flowable:targetDockerY="40.0">
                <omgdi:waypoint x="67.94999895119737" y="123.0"></omgdi:waypoint>
                <omgdi:waypoint x="135.0" y="123.0"></omgdi:waypoint>
            </bpmndi:BPMNEdge>
            <bpmndi:BPMNEdge bpmnElement="sid-E025FC2C-2857-4377-9D87-37FCC68C6781"
                             id="BPMNEdge_sid-E025FC2C-2857-4377-9D87-37FCC68C6781" flowable:sourceDockerX="50.0"
                             flowable:sourceDockerY
<think>好的,我需要帮助用户了解Flowable工作流中多实例并行的实现方式和配置方法。首先,我应该回忆一下Flowable的相关知识,特别是多实例任务的部分。根据用户提供的引用内容,特别是引用[1]、[3]和[4],这些提到了多实例的配置、会签以及并行临时任务的添加。 首先,多实例在Flowable中通常用于处理需要多个参与者的情况,比如会签。用户提到的多实例并行流程设计,应该涉及到在用户任务节点上设置多实例属性。引用[3]指出,多实例任务会签是通过在userTask节点配置多实例属性实现的,这可能包括设置并行类型、集合变量、实例数量等。 接下来,我需要考虑配置的具体步骤。根据引用[1],多实例类型有串行和并行两种,这里用户关注的是并行。因此,配置时需要在流程设计中将multiInstanceType设置为parallel。此外,集合变量如userList用来指定参与者,元素变量如userItem用于迭代,这可能需要在XML中定义。 然后,流程设计器的操作部分也很重要。用户可能使用Flowable UI设计器,所以需要指导如何在图形界面中设置多实例属性。例如,在任务属性面板中勾选多实例,选择并行,并填写相关变量。 另外,引用[4]提到添加并行临时任务的情况,虽然用户的问题主要在于配置已有的多实例并行任务,但这也可能涉及动态添加任务的方法,不过可能超出当前问题范围,但可以作为补充信息提及。 还需要注意,多实例并行的执行逻辑,比如所有分支同时创建,需要全部完成才能继续流程。这可能涉及到会签的完成条件,如使用nrOfInstances和nrOfActiveInstances变量来判断是否所有实例都完成。 最后,用户可能遇到的问题,比如回退并行流程的困难,引用[2]指出Flowable默认不支持并行流程的回退,需要自定义逻辑,这可能是一个注意事项。 总结一下,回答的结构应该包括基本概念、XML配置示例、设计器操作步骤、执行逻辑和注意事项,并引用提供的参考文献。需要确保使用正确的中文术语,并按照用户的要求分点说明,保持清晰的结构。</think>### Flowable工作流多实例并行实现与配置方法 #### 一、基本概念 多实例并行(Multi-instance Parallel)是Flowable中用于**同时处理多个相同任务分支**的机制,常用于会签、并行审批等场景。其核心逻辑是通过定义任务节点的`multiInstanceLoopCharacteristics`属性实现[^3]。 #### 二、XML配置方式 在流程定义文件(BPMN 2.0 XML)中,需为任务节点添加以下属性: ```xml <userTask id="multiInstanceTask" name="并行审批"> <multiInstanceLoopCharacteristics isSequential="false" flowable:collection="userList" flowable:elementVariable="userItem"> <completionCondition>${nrOfCompletedInstances/nrOfInstances >= 1}</completionCondition> </multiInstanceLoopCharacteristics> </userTask> ``` - `isSequential="false"`:声明并行模式[^1] - `collection`:指定参与者集合变量,如`${userList}` - `elementVariable`:迭代元素变量,用于任务分配 - `completionCondition`:完成条件,此处表示任意一个实例完成即可推进流程 #### 三、流程设计器操作步骤(Flowable Modeler) 1. **设置多实例属性** - 在用户任务属性面板勾选`Multi instance` - 选择`Parallel`类型 - 配置集合变量:`${userList}` 2. **定义任务分配** ```javascript ${userItem} //直接使用元素变量 //或复杂表达式 ${taskService.createTaskQuery().taskCandidateUser(userItem).list()} ``` 3. **配置完成条件** - 使用预定义变量: $$nrOfInstances = \text{总实例数}, \quad nrOfCompletedInstances = \text{已完成实例数}$$ - 示例条件表达式:`${nrOfCompletedInstances == nrOfInstances}`(全部完成) #### 四、执行逻辑特点 1. **实例创建**:根据集合变量`userList`长度自动生成并行任务 2. **变量隔离**:每个实例拥有独立的`execution`上下文[^3] 3. **流程推进**:需满足`completionCondition`才继续后续节点 #### 五、特殊场景实现 1. **动态添加并行任务**(运行时修改): ```java runtimeService.addMultiInstanceExecution( "taskId", "流程实例ID", Collections.singletonMap("新增用户变量", newUser) ); ``` 此方法可在不修改流程定义的情况下追加并行分支[^4] 2. **多实例会签**: - 需配合`Candidate users`配置 - 每个实例对应不同处理人 - 支持`nrOfActiveInstances`监控进行中任务数 #### 六、注意事项 1. **变量作用域**:集合变量需在流程实例级别定义 2. **历史数据**:并行任务会产生多条历史记录 3. **回退限制**:原生引擎不支持并行流程回滚,需自行实现补偿逻辑[^2] ###
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值