flowable/flowable-engine · error · FlowableException
DMN decision with key ${finalDecisionKeyValue} execution fai
Error message
DMN decision with key ${finalDecisionKeyValue} execution failed in ${execution} What it means
The DMN engine executed the decision identified by finalDecisionKeyValue and the audit container reported failure. Flowable wraps the original decision exception in this FlowableException so the process-level error includes the decision key and execution context. Check the cause (decisionExecutionAuditContainer.getException()) for the real problem inside the decision model.
Source
Thrown at modules/flowable-engine/src/main/java/org/flowable/engine/impl/bpmn/behavior/DmnActivityBehavior.java:113
}
DmnDecisionService ruleService = CommandContextUtil.getDmnRuleService();
ExecuteDecisionBuilder executeDecisionBuilder = ruleService.createExecuteDecisionBuilder()
.decisionKey(finalDecisionKeyValue)
.instanceId(execution.getProcessInstanceId())
.executionId(execution.getId())
.activityId(task.getId())
.variables(execution.getVariables())
.tenantId(execution.getTenantId());
applyFallbackToDefaultTenant(execution, executeDecisionBuilder);
applyParentDeployment(execution, executeDecisionBuilder, processEngineConfiguration);
DecisionExecutionAuditContainer decisionExecutionAuditContainer = executeDecisionBuilder.executeWithAuditTrail();
if (decisionExecutionAuditContainer.isFailed()) {
throw new FlowableException("DMN decision with key " + finalDecisionKeyValue + " execution failed in " + execution,
decisionExecutionAuditContainer.getException());
}
/*Throw error if there were no rules hit when the flag indicates to do this.*/
FieldExtension throwErrorFieldExtension = DelegateHelper.getFlowElementField(execution, EXPRESSION_DECISION_TABLE_THROW_ERROR_FLAG);
if (throwErrorFieldExtension != null) {
String throwErrorString = null;
if (StringUtils.isNotEmpty(throwErrorFieldExtension.getStringValue())) {
throwErrorString = throwErrorFieldExtension.getStringValue();
} else if (StringUtils.isNotEmpty(throwErrorFieldExtension.getExpression())) {
throwErrorString = throwErrorFieldExtension.getExpression();
}
if (decisionExecutionAuditContainer.getDecisionResult().isEmpty() && throwErrorString != null) {
if ("true".equalsIgnoreCase(throwErrorString)) {
throw new FlowableException("DMN decision with key " + finalDecisionKeyValue + " did not hit any rules for the provided input. In " + execution);
View on GitHub (pinned to d6d39ce1c6)
Solutions
- Inspect the exception cause (audit container / logged stack trace) to find the failing rule or expression in the DMN model
- Verify all input variables referenced by the decision table's input expressions exist on the execution before the DMN task
- Validate and redeploy the DMN model after fixes (fix expression syntax, types, hit policy)
- Test the decision in isolation (DmnRuleService / DMN engine test harness) with representative input data
Example fix
// before: DMN input expression references missing variable
inputExpression: ${customerAge} // not set on execution
// after
delegateExecution.setVariable("customerAge", 30); // before DMN task Defensive patterns
Strategy: try-catch
Validate before calling
for (String name : List.of("customerAge", "customerCategory")) {
if (execution.getVariable(name) == null) {
throw new IllegalStateException("Missing DMN input variable: " + name);
}
} Try / catch
try {
executeDecisionBuilder.executeWithAuditTrail();
} catch (FlowableException e) {
log.error("DMN decision failed: {}", e.getCause() != null ? e.getCause().getMessage() : e.getMessage(), e);
// route to boundary error event / compensation
} Prevention
- Inspect the exception cause for the real rule/expression failure
- Unit-test each DMN model with typical and edge-case inputs
- Verify all input expressions' variables exist before execution
- Validate DMN models before deployment
When it happens
Trigger: executeDecisionBuilder.executeWithAuditTrail() returns a DecisionExecutionAuditContainer with isFailed()==true — typically an exception thrown while evaluating the decision table: invalid expression in a rule, missing input variable referenced by an input expression, or an internal DMN engine error.
Common situations: Decision table rules reference input variables not present on the execution; a rule condition expression throws (e.g. division by null); the deployed DMN model has a broken expression after being edited; hit-policy/aggregation misconfiguration causing evaluation errors.
Related errors
- more than one result in decision:
- more than one result
- DMN decision with key ${finalDecisionKeyValue} did not hit a
- Error determine output clause for position: {}
- Error determine output clause for position: {}
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/ed877578918e9d9c.
Report an issue: GitHub.