Flowable是一个强大的工作流引擎,它允许我们定义、执行和管理业务流程。在Flowable中,流程变量是一个核心概念,它们用于在流程执行期间传递数据。正确地处理子流程变量对于实现高效、灵活的业务流程至关重要。本文将详细介绍Flowable中子流程变量的处理方式,帮助读者更好地理解和应用这些技术概念。

一、子流程变量的基本概念

在Flowable中,子流程是一个独立的流程实例,它可以被另一个主流程调用。子流程变量是指在子流程中定义和使用的流程变量。这些变量在子流程的执行过程中起到传递和存储数据的作用。

二、子流程变量的传递
  1. 父流程向子流程传递变量
  • 使用flowable:in标签定义父流程变量传入到子流程的流程变量映射。在子流程启动时,这些变量会被复制到子流程中。
  • 示例:
<callActivity id="Activity_1q7t28e" name="贷款额度审批" calledElement="ApproveLoanSubProcess"
    flowable:inheritVariables="true"
    flowable:processInstanceName="贷款额度审批"
    flowable:calledElementType="key">
    <extensionElements>
        <flowable:in>
            <flowable:argument name="loanAmount" expression="${loanAmount}" />
        </flowable:in>
    </extensionElements>
</callActivity>
  1. 子流程向父流程传递变量
  • 使用flowable:out标签定义子流程变量回传到父流程的流程变量映射。在子流程结束时,这些变量会被复制回主流程。
  • 示例:
<callActivity id="Activity_1q7t28e" name="贷款额度审批" calledElement="ApproveLoanSubProcess"
    flowable:inheritVariables="true"
    flowable:processInstanceName="贷款额度审批"
    flowable:calledElementType="key">
    <extensionElements>
        <flowable:out>
            <flowable:argument name="approvedLoanAmount" expression="${approvedLoanAmount}" />
        </flowable:out>
    </extensionElements>
</callActivity>
三、子流程变量的设置和使用
  1. 在子流程中设置全局流程变量
  • 全局流程变量在整个子流程执行期间都是有效的。这意味着一旦设置了全局流程变量,它就可以在子流程的任何地方被访问和修改。
  • 示例:
Map<String, Object> variables = new HashMap<>();
variables.put("approvedLoanAmount", 150000);
runtimeService.startProcessInstanceByKey("ApproveLoanSubProcess", variables);
  1. 在子流程中设置本地流程变量
  • 本地流程变量只针对子流程中的某个具体任务(Task)有效。当任务执行完毕后,该本地流程变量就会失效。
  • 示例:
Task task = taskService.createTaskQuery().singleResult();
taskService.setVariable(task.getId(), "taskAssignee", "张三");
  1. 在子流程中使用UEL表达式设置流程变量
  • UEL(Unified Expression Language)是一种强大的表达式语言,它允许我们在Flowable中使用动态表达式来设置和获取流程变量。
  • 示例:
<userTask id="Activity_1pxhie8" name="复核贷款额度">
    <extensionElements>
        <flowable:assigneeExpression>${taskAssignee}</flowable:assigneeExpression>
    </extensionElements>
</userTask>
四、注意事项
  1. 变量作用域
  • 全局流程变量的作用域是整个流程实例,包括主流程和子流程。
  • 本地流程变量的作用域是特定的任务或执行实例。
  • 在子流程中设置的变量,默认情况下不会影响到主流程中的变量。
  1. 变量命名冲突
  • 全局变量和局部变量之间可以存在相同的变量名,但它们的作用域不同,因此不会发生冲突。
  • 在设置变量时,应尽量避免使用重复的变量名,以免引起混淆。
  1. 序列化问题
  • 如果流程变量的值是一个对象,那么该对象必须实现Serializable接口,以便在流程执行过程中进行序列化和反序列化。
五、总结

Flowable中子流程变量的处理是实现高效、灵活业务流程的重要部分。通过正确地传递、设置和使用子流程变量,我们可以实现复杂的业务逻辑和数据传递需求。在实际应用中,我们应根据具体需求选择合适的方式来处理子流程变量,以满足不同的业务场景需求。