如何通过Flowable Java API实现BPMN流程集成调用DMN决策表
Flowable BPMN与DMN结合使用Java API操作指南
1. 补充DMN依赖
你当前仅引入了核心流程引擎依赖,要使用DMN能力需要额外添加同版本的DMN引擎依赖:
<dependency> <groupId>org.flowable</groupId> <artifactId>flowable-dmn-engine</artifactId> <version>6.7.0</version> </dependency>
2. 部署关联后的资源文件
注意:必须将关联的BPMN流程文件和DMN决策表放在同一个部署批次中,否则流程执行时会找不到关联的决策表
// 沿用你已有的ProcessEngine初始化逻辑 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); RepositoryService repositoryService = processEngine.getRepositoryService(); // 同时加载两个资源完成部署 repositoryService.createDeployment() .addClasspathResource("你的业务流程文件路径.bpmn.xml") .addClasspathResource("你的决策表文件路径.dmn.xml") .deploy();
3. 两种结合使用方式
3.1 BPMN自动触发DMN决策(推荐)
如果你已经在BPMN中配置了绑定DMN的业务规则任务,流程执行到该节点时会自动调用决策表,无需额外编码:
- 你需要在BPMN业务规则任务中配置
implementation为dmn,decisionRef为决策表的id/key,同时指定结果存储的变量名,比如dmnResult - 启动流程时传入DMN需要的输入参数即可,示例代码:
RuntimeService runtimeService = processEngine.getRuntimeService(); // 传入DMN所需的输入参数,例如请假天数、员工职级等 Map<String, Object> variables = new HashMap<>(); variables.put("leaveDays", 5); variables.put("staffLevel", "P3"); // 启动流程实例,走到业务规则节点时会自动执行DMN ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("你的流程key", variables); // 从流程变量中直接获取DMN执行结果 List<Map<String, Object>> dmnResult = (List<Map<String, Object>>) runtimeService.getVariable(processInstance.getId(), "dmnResult");
3.2 手动调用DMN API执行
如果你需要在流程外部、或者在BPMN的服务任务中自定义调用逻辑,可以直接调用DMN服务API:
// 获取DMN规则服务实例 DmnRuleService dmnRuleService = processEngine.getDmnRuleService(); Map<String, Object> inputParams = new HashMap<>(); inputParams.put("leaveDays", 3); inputParams.put("staffLevel", "P5"); // 执行指定key的决策表,返回命中的规则结果 List<Map<String, Object>> result = dmnRuleService.createExecuteDecisionBuilder() .decisionKey("你的决策表key") .variables(inputParams) .execute();
4. 结果说明
DMN执行返回的List<Map<String, Object>>中,每一个Map对应一条命中的规则结果,你可以直接作为流程变量传递给后续BPMN节点,或者用于业务逻辑判断。
内容的提问来源于stack exchange,提问作者Samy
相关产品推荐
相关产品推荐

