BPMN 子流程Subprocess——Camunda Workflow

子流程是包含了一系列activities,网关,事件等的特殊Activity。

  • 子流程允许分层设计Workflow,提供更高维度的流程图视角,隐藏子流程实现细节。
  • 子流程会为事件创建一个新的作用域,像Message,Timer等事件不仅可以应用在Service上,还可以绑定在整个子流程上面。

嵌入式子流程 Embedded Subprocess

子流程也需要有一个启动事件和一个结束事件,BPMN2.0 支持省略两者,但是Camunda引擎暂时还不支持。另外,子流程当中的所有序列流都不可以越过子流程边界。

示例:

收到Boundary Event:

 或Complete Subprocess

 

 调用式子流程 Call Activity

调用子流程可以和主流程分属于不同的流程定义。嵌入式子流程和主流程定义在同一个BPMN文件中,而调用子流程可以是一个已知的流程,也可以单独进行定义部署。

示例:

1. 首先定义一个子流程名为 Local Test Subprocess ,版本1.0,并部署。

2. 在主流程当中定义调用

 

 3. 调用子流程

 

 Call Activity的定义需要保证一下两点:

  1. 必须使用子流程的Id来调用子流程,作为Called Element的值。
  2. 必须正确的指定子流程的版本。
  • Lastest:使用最新版本
  • Deployment:按照Deployment Id查找,必须是与主流程一起部署的子流程才可以使用
  • Version:指定Version,此为Camunda维护,以1,2,3递增...
  • Version Tag:  为用户自定义的BPMN Version Tag属性

 Call Activity的变量传递

1. 子流程无法获得主流程作用域中的变量: 

2. 但可以通过Variables in Mapping的方式传递变量到子流程(复制值传递): 

 3. 也可以通过Variables out Mapping的方式传递子流程变量到主流程:

 

把Price改为60 

 事件子流程 Event Subprocess

 如下图所示,事件子流程没有传入序列流和传出序列流,它以一个Start Event开始,  并且事件订阅在主流程作用域当中一直存在。我们可以用之前文章提到的用Postman查询当前的事件订阅,并触发。

case 1.  将Price改为60,触发 Conditional Event

图中的 Conditional Start Event是实线,意味着它属于Interrupting Event,很明显它的触发会中止当前主流程,并且我们可以注意到此时的子流程和主流程处于同一个作用域,共享变量。

 case 2. 触发 Non-Interrupting Message

虚线表示的Start Event属于Non-Interrupting模式,因此它不会中断当前流程,所以这种 Non-Interrupting模式子流程可以被多次触发。

 事务子流程 Transaction Subprocess

BPMN当中的事务与程序中的事务并不完全相同。BPMN 事务本质上是依靠Compensation Event(补偿机制),Cancel Event等,从Workflow设计层面上来实现回滚的。

接下来,我们通过一个订单预定的例子,来演示BPMN中事务子流程的用法:

 ​​​​​​​​​​​​​1.  初始化Count = 10, Money = 0.

 2.  预定,Count - 1,到扣款阶段

3. 扣款失败,Throw Error Event

 ​​​4. 触发Cancel End Event,同时Cancel End Event又会启动事务子流程当中的补偿机制,执行Count + 1

 5. 补偿完成,触发子流程 Cancel Boundary Event,事务结束。

 

接下来,我们对该Workflow稍加修改,将扣款失败改为Error End Event, 可以看到,Error End Event 不会启动补偿机制而是直接中断子进程。

 

 

 

 

 

 

<think>我们面临的任务是将AntV X6的数据结构转换为BPMN XML格式。根据引用[1],Flowable的Modeler前端使用JSON表示流程定义,但最终会转换为BPMN XML。虽然引用中没有直接提供AntV X6到BPMN XML的转换工具,但我们可以借鉴类似思路。 根据引用[2],AntV X6是一个高度可定制的图表编辑引擎,我们可以利用其API获取流程图的节点和连线数据。引用[3]提到workflow-bpmn-modeler项目基于bpmn.io实现BPMN设计器,这为我们提供了BPMN XML的结构参考。 转换步骤建议如下: 1. **提取AntV X6数据**:使用AntV X6的API获取节点和边的数据,通常是一个JSON对象,包含节点列表和边列表。 ```javascript const nodes = graph.getNodes(); const edges = graph.getEdges(); ``` 2. **设计映射规则**:将AntV X6的节点和边映射到BPMN元素(如任务、网关、事件等)。例如: - 矩形节点 -> BPMN任务 - 菱形节点 -> BPMN网关 - 圆形节点 -> BPMN事件 3. **构建BPMN XML**:根据映射规则生成BPMN XML。可以使用XML构建工具(如xmlbuilder2)或模板引擎。引用[4]提到利用XMLBean生成XML的方法,但这里我们使用JavaScript环境。 以下是一个简化的BPMN XML结构示例: ```xml <bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL"> <bpmn:process id="Process_1"> <!-- 节点映射 --> <bpmn:task id="task1" name="Task 1"/> <bpmn:exclusiveGateway id="gateway1"/> <!-- 边映射 --> <bpmn:sequenceFlow id="flow1" sourceRef="task1" targetRef="gateway1"/> </bpmn:process> </bpmn:definitions> ``` 4. **处理属性**:将AntV X6元素的属性(如名称、条件)映射到BPMN XML的对应属性。 5. **验证和优化**:使用BPMN验证工具(如bpmn-js)验证生成的XML,确保符合BPMN 2.0规范。 由于AntV X6和BPMN XML在数据模型上存在差异,可能需要中间模型进行转换。例如: ``` AntV X6 JSON -> 中间模型(通用流程模型) -> BPMN XML ``` 参考引用[3]中的workflow-bpmn-modeler项目,可以研究其如何将Vue组件中的图形数据转换为BPMN XML,借鉴其转换逻辑。 **注意事项**: - AntV X6的自定义属性可能需要特殊处理 - BPMN的规范要求严格,需确保生成的XML包含必需的命名空间和属性 - 复杂网关(如并行网关)需要正确映射 如果转换需求复杂,可以考虑使用bpmn-moddle等库辅助构建BPMN模型。</think>要将 AntV X6 的数据结构转换为 BPMN XML 格式,需要经过以下步骤(参考引用[1][2][4]): ### 转换步骤 1. **解析 AntV X6 数据结构** - 从 AntV X6 获取流程图数据(通常是 JSON 格式) - 提取关键元素: ```javascript const nodes = graph.getNodes(); // 获取所有节点 const edges = graph.getEdges(); // 获取所有连线 ``` 2. **设计映射规则** | AntV X6 元素 | BPMN 元素 | XML 标签 | |--------------|-------------------|------------------------| | 矩形节点 | 任务节点 | `<bpmn:task>` | | 菱形节点 | 网关 | `<bpmn:exclusiveGateway>` | | 圆形节点 | 事件 | `<bpmn:startEvent>` | | 连线 | 顺序流 | `<bpmn:sequenceFlow>` | | 文本标签 | 名称属性 | `name="标签内容"` | 3. **构建 BPMN XML(参考引用[4])** ```xml <bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL"> <bpmn:process id="Process_1"> <!-- 转换节点 --> <bpmn:task id="Task_1" name="审批申请"/> <!-- 转换连线 --> <bpmn:sequenceFlow id="Flow_1" sourceRef="Task_1" targetRef="Task_2"/> </bpmn:process> </bpmn:definitions> ``` 4. **特殊处理** - **条件表达式**:在连线上添加条件 ```xml <bpmn:sequenceFlow> <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression"> ${amount > 10000} </bpmn:conditionExpression> </bpmn:sequenceFlow> ``` - **嵌套结构**:处理流程映射 ```xml <bpmn:subProcess id="SubProcess_1"> <!-- 流程内容 --> </bpmn:subProcess> ``` ### 实现建议(参考引用[2][3]) 1. **使用转换库**: ```javascript import { BPMNConverter } from 'x6-bpmn-adapter'; const xml = BPMNConverter.toBPMN(graph.toJSON()); ``` 2. **手动转换示例**: ```javascript function convertToBPMN(graphData) { let xml = `<bpmn:definitions>...`; graphData.nodes.forEach(node => { xml += `<bpmn:${node.shape} id="${node.id}"...>`; }); // ...处理连线 return xml; } ``` 3. **验证 XML**: - 使用 Flowable 的 BPMN 验证器 - 通过 bpmn.io 在线验证工具检查 > **重要提示**:BPMN XML 需要严格遵循规范(引用[1])。建议先用简单流程图测试转换逻辑,再逐步支持复杂场景。转换后的 XML 可通过 Flowable Modeler 导入验证(引用[3])。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值