如何在Fluent BPMN API中创建关联流(Association-Flow,非顺序流)?
嘿,刚好我之前用Fluent BPMN API做过关联流的开发,这就给你详细说下怎么实现!
首先得明确:在BPMN规范里,关联流(Association)主要用来连接文本注释、数据对象和流程元素(比如任务、网关),和顺序流(Sequence Flow)的跳转逻辑完全不同。Fluent BPMN API提供了直接的方法来创建这类关联,下面分两种场景给你示例:
1. 基础API方式(手动创建关联流)
如果是手动构建BPMN模型实例,你可以直接创建Association对象,指定源、目标元素和关联方向:
// 先初始化模型、流程,创建需要关联的元素(比如用户任务和文本注释) BpmnModelInstance modelInstance = Bpmn.createEmptyModel(); Definitions definitions = modelInstance.newInstance(Definitions.class); definitions.setTargetNamespace("http://your-company.com/bpmn"); modelInstance.setDefinitions(definitions); Process process = modelInstance.newInstance(Process.class); process.setId("approval-process"); definitions.addChildElement(process); // 创建用户任务 UserTask submitTask = modelInstance.newInstance(UserTask.class); submitTask.setId("submit-application"); submitTask.setName("提交审批申请"); process.addChildElement(submitTask); // 创建文本注释 TextAnnotation tipAnnotation = modelInstance.newInstance(TextAnnotation.class); tipAnnotation.setId("submit-tip"); tipAnnotation.setText("请上传身份证和收入证明附件"); process.addChildElement(tipAnnotation); // 创建单向关联流:从注释指向任务 Association association = modelInstance.newInstance(Association.class); association.setId("assoc-submit-tip"); association.setSourceRef(tipAnnotation.getId()); association.setTargetRef(submitTask.getId()); // 设置关联方向:ONE=单向,BOTH=双向,NONE=无方向 association.setAssociationDirection(AssociationDirection.ONE); process.addChildElement(association);
2. 链式Fluent API方式(更简洁)
如果你用Fluent BPMN的链式调用风格,代码会更紧凑,直接用associateWith()方法就能关联元素:
BpmnModelInstance modelInstance = Bpmn.createExecutableProcess("approval-process") // 构建流程主逻辑 .startEvent("start") .userTask("submit-application").name("提交审批申请") .endEvent("end") // 跳转到用户任务,关联文本注释 .moveToUserTask("submit-application") .associateWith("submit-tip", AssociationDirection.ONE) // 创建文本注释 .textAnnotation("submit-tip").text("请上传身份证和收入证明附件") .done();
关键注意点
- 关联的元素必须都属于同一个流程实例,ID要唯一且正确,否则会出现元素找不到的问题
- 关联方向
AssociationDirection的三个枚举值对应不同的显示效果:ONE会显示带箭头的连线,BOTH是双向箭头,NONE是无箭头的虚线 - 除了注释和任务,你也可以用同样的方式关联数据对象(DataObject)和流程元素,只需要把
TextAnnotation换成DataObject即可
内容的提问来源于stack exchange,提问作者Alpha_33
相关产品推荐
相关产品推荐

