flowable/flowable-engine · error · ActivitiException

No outgoing sequence flow of the inclusive gateway '${activi

Error message

No outgoing sequence flow of the inclusive gateway '${activityId}' could be selected for continuing the process

What it means

An inclusive (OR) gateway finished evaluating all its outgoing sequence flows and none of their conditions evaluated to true, and there is no valid default flow to fall back on. The engine refuses to continue the process because it has nowhere to route execution, so it throws this ActivitiException from InclusiveGatewayActivityBehavior.execute.

Source

Thrown at modules/flowable5-engine/src/main/java/org/activiti/engine/impl/bpmn/behavior/InclusiveGatewayActivityBehavior.java:93

                }
            }

            if (!transitionsToTake.isEmpty()) {
                activityExecution.takeAll(transitionsToTake, joinedExecutions);

            } else {

                if (defaultSequenceFlow != null) {
                    PvmTransition defaultTransition = activityExecution.getActivity().findOutgoingTransition(defaultSequenceFlow);
                    if (defaultTransition != null) {
                        activityExecution.take(defaultTransition);
                    } else {
                        throw new ActivitiException("Default sequence flow '"
                                + defaultSequenceFlow + "' could not be not found");
                    }
                } else {
                    // No sequence flow could be found, not even a default one
                    throw new ActivitiException(
                            "No outgoing sequence flow of the inclusive gateway '"
                                    + activityExecution.getActivity().getId()
                                    + "' could be selected for continuing the process");
                }
            }

        } else {
            if (LOGGER.isDebugEnabled()) {
                LOGGER.debug("Inclusive gateway '{}' does not activate", activity.getId());
            }
        }
    }

    List<? extends ActivityExecution> getLeaveExecutions(ActivityExecution parent) {
        List<ActivityExecution> executionlist = new ArrayList<>();
        List<? extends ActivityExecution> subExecutions = parent.getExecutions();
        if (subExecutions.isEmpty()) {
            executionlist.add(parent);

View on GitHub (pinned to d6d39ce1c6)

Solutions

  1. Add a default sequence flow to the inclusive gateway (no condition) so there is always a route when all conditions are false.
  2. Audit the gateway's outgoing flow conditions so their branches cover all possible variable combinations.
  3. Verify the gateway's 'default' attribute references an existing outgoing sequence flow id in the BPMN XML (else the earlier 'Default sequence flow ... could not be found' variant fires).
  4. Ensure the variables used in the conditions are actually set before the gateway is reached (e.g. via input mapping or service tasks).

Example fix

<!-- before -->
<inclusiveGateway id="gw1">
  <sequenceFlow id="f1" sourceRef="gw1" targetRef="a">
    <conditionExpression xsi:type="tFormalExpression">${amount > 100}</conditionExpression>
  </sequenceFlow>
</inclusiveGateway>

<!-- after: default flow guarantees a route -->
<inclusiveGateway id="gw1" default="fDefault">
  <sequenceFlow id="f1" sourceRef="gw1" targetRef="a">
    <conditionExpression xsi:type="tFormalExpression">${amount > 100}</conditionExpression>
  </sequenceFlow>
  <sequenceFlow id="fDefault" sourceRef="gw1" targetRef="fallback"/>
</inclusiveGateway>
Defensive patterns

Strategy: validation

Validate before calling

// Validate at deploy/design time: every inclusive gateway either has a default flow or conditions covering all cases.
// BPMN parse-time check example:
boolean hasDefault = gateway.getAttributeValue("default") != null
    && gateway.getOutgoingFlows().stream().anyMatch(f -> f.getId().equals(gateway.getAttributeValue("default")));
boolean conditionsAlwaysTrue = variablesSatisfyAtLeastOneCondition(allRuntimeVariableCombinations, gateway.getConditionedFlows());
if (!hasDefault && !conditionsAlwaysTrue) {
    throw new IllegalStateException("Inclusive gateway '" + gateway.getId() + "' can dead-end");
}

Try / catch

try {
    runtimeService.startProcessInstanceByKey(key, vars);
} catch (org.activiti.engine.ActivitiException e) {
    if (e.getMessage() != null && e.getMessage().contains("No outgoing sequence flow of the inclusive gateway")) {
        // log gateway id, fix model (add default flow) and re-run
    } else {
        throw e;
    }
}

Prevention

When it happens

Trigger: Executing a BPMN inclusive gateway where every outgoing sequence flow's condition evaluates false and either no default sequence flow is defined or the configured default flow id does not exist on the gateway element.

Common situations: Modelling exclusive-style condition sets (${amount > 100}) that never cover all cases; data-dependent conditions where runtime variables fall outside all expected ranges; refactoring flow ids so the gateway's 'default' attribute points to a deleted/renamed flow; migrating from exclusive gateways without adding a default flow.

Understand the failure class

Background: "Invalid state transition" errors: "status must be X, actually Y", "already rejected/charging/uninstalled", "cannot ... while running" — what they mean when a library rejects your call — this error's family across 31 libraries.

Related errors


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