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

  1. Inspect the exception cause (audit container / logged stack trace) to find the failing rule or expression in the DMN model
  2. Verify all input variables referenced by the decision table's input expressions exist on the execution before the DMN task
  3. Validate and redeploy the DMN model after fixes (fix expression syntax, types, hit policy)
  4. 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

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


AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11). Data as JSON: /api/errors/ed877578918e9d9c. Report an issue: GitHub.