别再手动画图了!用Java代码生成Activiti流程图XML(附完整代码示例)
·
用Java代码自动化生成Activiti流程图的实战指南
在传统的工作流开发中,我们通常依赖Activiti Designer等可视化工具手动拖拽绘制流程图。但当遇到需要批量生成相似流程、根据配置动态调整流程结构,或者将流程设计集成到自研系统中时,手动操作就显得力不从心了。本文将深入讲解如何通过Java代码直接构建Activiti流程图模型,并输出标准BPMN 2.0 XML文件的全套技术方案。
1. Activiti流程图代码化生成的核心原理
Activiti作为一款成熟的BPMN 2.0流程引擎,其架构设计本身就支持以编程方式操作流程模型。核心模块 activiti-bpmn-model 提供了完整的BPMN元素对象模型,而 activiti-bpmn-converter 则负责模型与XML之间的双向转换。
关键组件解析 :
BpmnModel:整个流程图模型的容器,包含流程定义和图形布局信息Process:对应BPMN中的<process>元素,是流程元素的顶级容器FlowElement:所有流程元素(如任务、网关、事件)的基类GraphicInfo:存储元素的图形化布局信息(坐标、尺寸)BpmnXMLConverter:执行模型与XML互相转换的核心类
// 基础模型构建示例
BpmnModel model = new BpmnModel();
Process process = new Process();
process.setId("onboardingProcess");
model.getProcesses().add(process);
2. 构建完整流程图的代码实现
2.1 创建流程元素
不同类型的流程元素对应不同的Java类,均继承自 FlowElement :
// 用户任务
UserTask reviewTask = new UserTask();
reviewTask.setId("hrReview");
reviewTask.setName("HR审核");
reviewTask.setAssignee("hrDepartment");
// 排他网关
ExclusiveGateway decisionGateway = new ExclusiveGateway();
decisionGateway.setId("approvalDecision");
// 开始事件
StartEvent startEvent = new StartEvent();
startEvent.setId("start");
2.2 设置元素图形布局
每个可视元素都需要指定其在流程图中的位置和大小:
GraphicInfo taskGraphic = new GraphicInfo();
taskGraphic.setX(100);
taskGraphic.setY(200);
taskGraphic.setWidth(100);
taskGraphic.setHeight(80);
model.addGraphicInfo("hrReview", taskGraphic);
2.3 连接元素形成流程
通过 SequenceFlow 建立元素间的连接关系:
SequenceFlow flow1 = new SequenceFlow();
flow1.setId("flow1");
flow1.setSourceRef("start");
flow1.setTargetRef("hrReview");
// 设置连线路径点
List<GraphicInfo> flowPath = new ArrayList<>();
GraphicInfo point1 = new GraphicInfo(250, 180);
GraphicInfo point2 = new GraphicInfo(250, 220);
flowPath.add(point1);
flowPath.add(point2);
model.addFlowGraphicInfoList("flow1", flowPath);
3. 高级功能实现技巧
3.1 动态生成多级审批流程
以下代码展示了如何根据审批级别配置动态生成审批链:
public Process buildApprovalProcess(int levels) {
Process process = new Process();
StartEvent start = new StartEvent();
start.setId("start");
process.addFlowElement(start);
FlowElement previous = start;
for (int i = 1; i <= levels; i++) {
UserTask task = new UserTask();
task.setId("approval_" + i);
task.setName("第" + i + "级审批");
process.addFlowElement(task);
SequenceFlow flow = new SequenceFlow();
flow.setSourceRef(previous.getId());
flow.setTargetRef(task.getId());
process.addFlowElement(flow);
previous = task;
}
EndEvent end = new EndEvent();
end.setId("end");
process.addFlowElement(end);
SequenceFlow finalFlow = new SequenceFlow();
finalFlow.setSourceRef(previous.getId());
finalFlow.setTargetRef("end");
process.addFlowElement(finalFlow);
return process;
}
3.2 处理复杂网关逻辑
对于包含条件分支的流程,需要正确配置网关和条件表达式:
ExclusiveGateway gateway = new ExclusiveGateway();
gateway.setId("decisionGate");
SequenceFlow approvedFlow = new SequenceFlow();
approvedFlow.setId("approvedFlow");
approvedFlow.setSourceRef("decisionGate");
approvedFlow.setTargetRef("archiveTask");
approvedFlow.setConditionExpression("${approved == true}");
SequenceFlow rejectedFlow = new SequenceFlow();
rejectedFlow.setId("rejectedFlow");
rejectedFlow.setSourceRef("decisionGate");
rejectedFlow.setTargetRef("correctionTask");
rejectedFlow.setConditionExpression("${approved == false}");
4. 生成最终BPMN XML文件
完成模型构建后,使用转换器生成标准XML:
BpmnXMLConverter converter = new BpmnXMLConverter();
byte[] xmlBytes = converter.convertToXML(model);
// 输出到文件
try (FileOutputStream out = new FileOutputStream("process.bpmn20.xml")) {
out.write(xmlBytes);
}
生成的XML文件可直接用于 :
- 部署到Activiti引擎
- 导入到Activiti Designer进行可视化调整
- 作为模板进一步加工处理
5. 实际项目中的最佳实践
在电商订单处理系统中,我们使用代码生成技术实现了动态流程配置:
- 模板组合 :将常见流程片段(如支付、物流、售后)预制为代码模块
- 规则引擎集成 :根据业务规则自动决定流程分支结构
- 版本控制 :将生成的BPMN XML纳入Git管理,实现流程设计的版本追踪
- 自动化测试 :对生成的流程进行验证测试,确保其可执行性
// 电商订单流程生成示例
public BpmnModel generateOrderProcess(OrderType type) {
BpmnModel model = new BpmnModel();
Process process = new Process();
// 添加公共起始节点
process.addFlowElement(createStartEvent());
// 根据订单类型添加特定环节
if (type == OrderType.VIRTUAL) {
process.addFlowElement(createVirtualProductHandling());
} else {
process.addFlowElement(createShippingActivities());
}
// 添加公共结束节点
process.addFlowElement(createEndEvent());
model.getProcesses().add(process);
return model;
}
通过代码生成Activiti流程图,我们实现了订单处理流程的灵活配置,将新流程上线时间从原来的2天缩短到2小时,同时显著降低了人为操作失误的风险。
更多推荐


所有评论(0)