Flowable-子流程-调用活动

✨✨✨ 最好用的Flowable流程设计器


定义

调用活动是在一个流程定义中调用另一个独立的流程定义,通常可以定义一些通用的流程作为
这种调用子流程,供其他多个流程定义复用。这种子流程使用 callActivity 元素来进行调用,很方
便地嵌入到主流程中,用起来比较方便。

图形标记

调用活动显示为标准的节点,它是一个圆角矩形,不过是粗边框,如图所示。

在这里插入图片描述

XML内容

调用活动的 XML 定义如下:

<callActivity id="Activity_1q7t28e" name="贷款额度审批" calledElement="ApproveLoanSubProcess" flowable:inheritVariables="true" flowable:processInstanceName="贷款额度审批" flowable:calledElementType="key">
    <extensionElements>
        <flowable:assigneeType>static</flowable:assigneeType>
        <flowable:formData />
        <flowable:modelBpmnExtension>[{"id":"8c7aefbf087f4d680fc36b871d77c967","modelId":"1252465dd6e511eda69100ff2cb2ed0e","modelKey":"ApproveLoanSubProcess","name":"贷款额度审批","appSn":"businessFlow","appName":"财务流程","categoryCode":"zshjt","categoryName":"中石化集团","status":3,"statusName":"已发布"}]</flowable:modelBpmnExtension>
    </extensionElements>
</callActivity>

调用活动是一个普通活动,需要通过 calledElement 属性引用被调用的外部流程定义的 key。调
用活动可以向子流程传递与接收流程变量:①使用 flowable:in 标签定义父流程变量传入到子流程流
程变量的映射,在子流程启动时复制到子流程;②使用用 flowable:out 标签定义子流程变量回传到父
流程变量的映射,在其结束时复制回主流程。调用活动的拓展属性如表所示:

属性名称属性说明示例
calledElement被调用流程的 key,对应的流程定义应独立存在<callActivity calledElement="testProcessDefinitonKey">
businessKey子流程的 businessKey,可以使用表达式<callActivity flowable:businessKey="subProcessBusinessKey">
inheritBusinessKey值为 true 时子流程复用父流程的 businessKey,该属性在businessKey 属性没有配置时才生效<callActivity flowable:inheritVariables="true">
inheritVariables值为 true 时将父流程所有流程变量传递给子流程<callActivity flowable:inheritVariables="true">
flowable:in将父流程的流程变量传入子流程(父流程变量必须事先定义,否则将不能获取)<flowable:in source="someVariableInMainProcess" target="nameOfVariableInSubProcess"></flowable:in>,source:主流程中的变量名称,可以使用表达式;target:在将主流程变量传递给子流程中变量的名称,一般和 sourse 同名避免错误的出现
flowable:out调用活动执行完成后的结果<flowable:out source="someVariableInSubProcss"target="nameOfVariableInMainProcess"></flowable:out>,source:子流程中的变量名称,可以使用表达式;target:在将子流程变量传递给父流程中变量的名称,一般和 source 同名避免错误的出现

由于主子流程是不同的实例,因此无法通过主流程的 key 查询子流程的任务,在查询子任务时需要使用子流程的 key 来进行查询。

界面操作

在这里插入图片描述

使用示例

子流程设计

子流程如图所示,子流程发起后首先进入“审批贷款额度”用户任务节点,审批完成后
由分支网关进行分支决策:贷款额度小于 100w 流程直接结束;贷款额度大于 100w 进入“复核贷
款额度”用户任务节点,审批完成后流程结束。

在这里插入图片描述

子流程的XML内容
<process id="ApproveLoanSubProcess" name="子流程-调用活动-审批贷款子流程" isExecutable="true">
    <startEvent id="ab7ef4cb0c5e6455ab4406613fb6b198f" />
    <userTask id="a43f40e7a7d60446585661ed8b2232732" name="审批贷款额度">
      <extensionElements>
        <flowable:formData />
        <flowable:assigneeType>static</flowable:assigneeType>
      </extensionElements>
    </userTask>
    <sequenceFlow id="a75d9acf085184bc5b49fcbb29a7768e9" sourceRef="ab7ef4cb0c5e6455ab4406613fb6b198f" targetRef="a43f40e7a7d60446585661ed8b2232732" />
    <exclusiveGateway id="Gateway_09287wv" default="Flow_0nh3xov" />
    <sequenceFlow id="Flow_1yaqka8" sourceRef="a43f40e7a7d60446585661ed8b2232732" targetRef="Gateway_09287wv" />
    <userTask id="Activity_1pxhie8" name="复核贷款额度">
      <extensionElements>
        <flowable:formData />
        <flowable:assigneeType>static</flowable:assigneeType>
      </extensionElements>
    </userTask>
    <sequenceFlow id="Flow_0nh3xov" name="额度&#62;100万元" sourceRef="Gateway_09287wv" targetRef="Activity_1pxhie8" />
    <endEvent id="Event_1cgk4gr" />
    <sequenceFlow id="Flow_1wdrb0h" name="额度&#60;=100万元" sourceRef="Gateway_09287wv" targetRef="Event_1cgk4gr">
      <conditionExpression xsi:type="tFormalExpression">${loanAmount&lt;=1000000}</conditionExpression>
    </sequenceFlow>
    <sequenceFlow id="Flow_1c8sxxy" sourceRef="Activity_1pxhie8" targetRef="Event_1cgk4gr" />
  </process>
主流程设计

主流程如图所示,主流程发起后进入“贷款申请”用户任务节点,提交后进入“贷款额
度审批”调用活动节点,父流程进入等待状态,启动并执行上述子流程,子流程结束后父流程继续
执行,进入“发放贷款”用户任务节点,办理完成后流程结束。

在这里插入图片描述

主流程的XML内容
<process id="CallActivitySubprocessTest" name="子流程-调用活动" isExecutable="true">
    <startEvent id="a3d0c6c7163c5499cb41510c83ba21645" />
    <userTask id="a8c6f47b1424b4115ba9f66434f10529e" name="贷款申请">
      <extensionElements>
        <flowable:formData />
        <flowable:assigneeType>static</flowable:assigneeType>
      </extensionElements>
    </userTask>
    <sequenceFlow id="a9b2a0637bfa449e29959c2b21d476125" sourceRef="a3d0c6c7163c5499cb41510c83ba21645" targetRef="a8c6f47b1424b4115ba9f66434f10529e" />
    <sequenceFlow id="Flow_14yhbzw" sourceRef="a8c6f47b1424b4115ba9f66434f10529e" targetRef="Activity_1q7t28e" />
    <callActivity id="Activity_1q7t28e" name="贷款额度审批" calledElement="ApproveLoanSubProcess" flowable:inheritVariables="true" flowable:processInstanceName="贷款额度审批" flowable:calledElementType="key">
      <extensionElements>
        <flowable:assigneeType>static</flowable:assigneeType>
        <flowable:formData />
        <flowable:modelBpmnExtension>[{"id":"8c7aefbf087f4d680fc36b871d77c967","modelId":"1252465dd6e511eda69100ff2cb2ed0e","modelKey":"ApproveLoanSubProcess","name":"贷款额度审批","appSn":"businessFlow","appName":"财务流程","categoryCode":"zshjt","categoryName":"中石化集团","status":3,"statusName":"已发布"}]</flowable:modelBpmnExtension>
      </extensionElements>
    </callActivity>
    <endEvent id="Event_16u42q4" />
    <userTask id="Activity_0olujzk" name="发放贷款">
      <extensionElements>
        <flowable:formData />
        <flowable:assigneeType>static</flowable:assigneeType>
      </extensionElements>
    </userTask>
    <sequenceFlow id="Flow_1dqsl2g" sourceRef="Activity_1q7t28e" targetRef="Activity_0olujzk" />
    <sequenceFlow id="Flow_0n0kqrn" sourceRef="Activity_0olujzk" targetRef="Event_16u42q4" />
  </process>

视频教程

调用活动

演示demo

调用活动-主流程

调用活动-子流程

本文中内容和案例出自贺波老师的书《深入Activiti流程引擎:核心原理与高阶实战》,书中的介绍更全面、详细,推荐给大家。
深入Activiti流程引擎

### Flowable流程的使用方法 #### 创建嵌套流程定义 在 Flowable 中,可以通过 BPMN 图形化编辑工具或 XML 定义来创建带有流程的工作流模型。对于流程而言,在父流程中可以将其视为一个单独的任务节点,该节点内部又包含了多个活动。 ```xml <process id="parentProcess" name="Parent Process"> <!-- ... --> <subProcess id="embeddedSubprocess" name="Embedded Sub-process"> <startEvent id="innerStart"/> <sequenceFlow id="flow1" sourceRef="innerStart" targetRef="taskInSubprocess"/> <userTask id="taskInSubprocess" name="User Task In Subprocess"></userTask> <endEvent id="innerEnd"/> </subProcess> <!-- ... --> </process> ``` 上述代码展示了如何在一个父进程中定义内嵌式的进程[^1]。 #### 调用外部已存在的流程 除了直接在当前流程文件里声明流程外,还可以通过 `callActivity` 来调用预先已经部署好的另一个独立 BPNM 流程作为流程执行: ```xml <process id="mainProcess" name="Main Process"> <!-- Other elements --> <callActivity id="calledChildProcess" calledElement="childProcessId"/> <!-- More elements --> </process> ``` 这里的关键在于设置属性 `calledElement` 的值为要被调用的目标流程 ID 或者 key 值[^2]。 #### 处理流程中的变量传递 当涉及到父流程间的数据交换时,通常会利用输入输出参数映射机制来进行数据共享。这允许开发者指定哪些局部变量应该从父级传入到级别以及反过来的情况。 ```java // 设置调用流程前后的变量操作逻辑 Map<String, Object> variables = new HashMap<>(); variables.put("inputVariable", "someValue"); runtimeService.startProcessInstanceByKey( "mainProcessKey", variables); // 获取完成之后的结果 ProcessInstance pi = runtimeService.createProcessInstanceQuery() .processInstanceId(processInstanceId) .singleResult(); if (pi != null && !pi.isEnded()) { // 进一步处理... } ``` 这段 Java 代码片段说明了怎样向新启动的过程实例注入初始变量集合,并查询特定过程的状态以获取最终结果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小学生05101

flowable

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值