flowable/flowable-engine · error · FlowableException

No channel keys configured for ${execution}

Error message

No channel keys configured for ${execution}

What it means

SendEventTaskActivityBehavior.getChannelModels throws this when no channel keys could be resolved for the send event task and the event is not being sent on the system channel. Flowable requires at least one destination channel unless sendOnSystemChannel applies.

Source

Thrown at modules/flowable-engine/src/main/java/org/flowable/engine/impl/bpmn/behavior/SendEventTaskActivityBehavior.java:211

                            } else {
                                throw new FlowableIllegalArgumentException("Can only use a collection of String elements for referencing channel model key");

                            }
                        }

                    } else if (resolvedChannelKey instanceof String) {
                        String[] keys = ((String) resolvedChannelKey).split(",");
                        channelKeys.addAll(Arrays.asList(keys));

                    }
                }
            }
        }

        if (channelKeys.isEmpty()) {
            if (!sendOnSystemChannel) {
                // If the event is going to be send on the system channel then it is allowed to not define any other channels
                throw new FlowableException("No channel keys configured for " + execution);
            } else {
                return Collections.emptyList();
            }
        }

        EventRepositoryService eventRepositoryService = CommandContextUtil.getEventRegistryEngineConfiguration(commandContext).getEventRepositoryService();
        List<ChannelModel> channelModels = new ArrayList<>(channelKeys.size());
        for (String channelKey : channelKeys) {
            if (Objects.equals(ProcessEngineConfiguration.NO_TENANT_ID, execution.getTenantId())) {
                channelModels.add(eventRepositoryService.getChannelModelByKey(channelKey));
            } else {
                channelModels.add(eventRepositoryService.getChannelModelByKey(channelKey, execution.getTenantId()));
            }
        }

        return channelModels;
    }

View on GitHub (pinned to d6d39ce1c6)

Solutions

  1. Add or correct the channelKey attribute on the send event task in the BPMN XML
  2. Ensure the variable or bean referenced by the channelKey expression is populated before the task executes and non-empty
  3. If the event should go through the platform's system channel, mark it as a system channel so the empty-list case is permitted
  4. Verify the expression result after splitting on commas is not an array of empty strings

Example fix

// before
<sendEvent eventType="orderShippedEvent"/>  <!-- no channelKey -->
// after
<sendEvent eventType="orderShippedEvent" channelKey="outboundOrderChannel"/>
Defensive patterns

Strategy: validation

Validate before calling

// Ensure channel keys are non-empty before executing the send event task
Object channels = execution.getVariable("channels");
if (channels == null || (channels instanceof Collection && ((Collection<?>) channels).isEmpty())) {
    throw new IllegalStateException("No channel keys configured for execution " + execution.getId());
}

Try / catch

try {
    processEngine.getRuntimeService().signal(executionId);
} catch (FlowableException e) {
    if (e.getMessage().startsWith("No channel keys configured")) {
        // set channelKey or mark event as system channel
    }
}

Prevention

When it happens

Trigger: The channelKey field/expression resolves to null or to an empty collection, and the execution is not on the system channel, so channelKeys.isEmpty() is true at the guard in getChannelModels.

Common situations: Forgetting to set the channelKey attribute on the send event task; an expression referencing a variable that was never set (resolves to null); a comma-split producing only blank entries that get filtered out.

Understand the failure class

Background: "missing required argument" and "the following required arguments were not provided": what required-argument errors mean and how to fix them — this error's family across 20 libraries.

Related errors


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