flowable/flowable-engine · error · FlowableException

No channel model set for outgoing {eventInstance}

Error message

No channel model set for outgoing {eventInstance}

What it means

DefaultOutboundEventProcessor.sendEvent() throws FlowableException when the collection of channel models to publish the event to is null or empty. An outbound event must be routed through at least one channel; with no channels the library cannot proceed. This is a programming/configuration error rather than a transient failure.

Source

Thrown at modules/flowable-event-registry/src/main/java/org/flowable/eventregistry/impl/DefaultOutboundEventProcessor.java:45

import org.flowable.eventregistry.model.OutboundChannelModel;

/**
 * @author Joram Barrez
 */
public class DefaultOutboundEventProcessor implements OutboundEventProcessor {

    protected EventRepositoryService eventRepositoryService;
    protected boolean fallbackToDefaultTenant;

    public DefaultOutboundEventProcessor(EventRepositoryService eventRepositoryService, boolean fallbackToDefaultTenant) {
        this.eventRepositoryService = eventRepositoryService;
        this.fallbackToDefaultTenant = fallbackToDefaultTenant;
    }
    
    @Override
    public void sendEvent(EventInstance eventInstance, Collection<ChannelModel> channelModels) {
        if (channelModels == null || channelModels.isEmpty()) {
            throw new FlowableException("No channel model set for outgoing " + eventInstance);
        }

        for (ChannelModel channelModel : channelModels) {

            OutboundChannelModel outboundChannelModel = (OutboundChannelModel) channelModel;

            Map<String, Object> headerMap = new HashMap<>();
            for (EventPayloadInstance headerInstance : eventInstance.getHeaderInstances()) {
                headerMap.put(headerInstance.getDefinitionName(), headerInstance.getValue());
            }
            
            OutboundEventProcessingPipeline<?> outboundEventProcessingPipeline = (OutboundEventProcessingPipeline<?>) outboundChannelModel.getOutboundEventProcessingPipeline();
            Object rawEvent = outboundEventProcessingPipeline.run(eventInstance);

            OutboundEventChannelAdapter outboundEventChannelAdapter = (OutboundEventChannelAdapter<?>) outboundChannelModel.getOutboundEventChannelAdapter();
            if (outboundEventChannelAdapter == null) {
                throw new FlowableException("Could not find an outbound channel adapter for channel " + channelModel.getKey());
            }

View on GitHub (pinned to d6d39ce1c6)

Solutions

  1. Deploy/bind at least one outbound channel model for the event (check the EventRepositoryService channel model deployments and the event's key bindings)
  2. Verify the event instance's key exactly matches the key the channel is bound to
  3. In custom code, guard before calling: only dispatch when channelModels != null && !channelModels.isEmpty(), or log/skip otherwise

Example fix

// before
outboundEventProcessor.sendEvent(eventInstance, resolvedChannels);
// after
if (resolvedChannels == null || resolvedChannels.isEmpty()) {
    throw new IllegalStateException("No channels bound for event key " + eventInstance.getEventKey());
}
outboundEventProcessor.sendEvent(eventInstance, resolvedChannels);
Defensive patterns

Strategy: validation

Validate before calling

null

Type guard

null

Try / catch

null

Prevention

When it happens

Trigger: Calling sendEvent(eventInstance, null) or sendEvent(eventInstance, Collections.emptyList()); more practically, event key/binding resolution returning zero channel models for the event instance (no channel model bound to the event, or event key mismatch).

Common situations: Deployed event/channel models missing the event-to-channel binding; dispatching an event whose key no channel consumes; custom pipeline code invoking the processor directly with an unfiltered empty collection.

Understand the failure class

Background: "X is required", "must be set", "cannot be empty": the missing-required-config error family, from Vertex AI project/location to WeChat keys — this error's family across 18 libraries.

Related errors


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