flowable/flowable-engine · error · FlowableIllegalArgumentException

Unrecognized ChannelModel class : ${channelModel.getClass()}

Error message

Unrecognized ChannelModel class : ${channelModel.getClass()}

What it means

registerChannelModel throws FlowableIllegalArgumentException when the ChannelModel is neither an InboundChannelModel nor an OutboundChannelModel. The deployer only supports these two concrete channel types; any other ChannelModel implementation is rejected with its class name.

Source

Thrown at modules/flowable-event-registry/src/main/java/org/flowable/eventregistry/impl/deployer/CachingAndArtifactsManager.java:94

        }
    }
    
    public void registerChannelModel(ChannelModel channelModel, ChannelDefinition channelDefinition, EventRegistryEngineConfiguration eventRegistryEngineConfiguration) {
        String channelDefinitionKey = channelModel.getKey();
        if (StringUtils.isEmpty(channelDefinitionKey)) {
            throw new FlowableIllegalArgumentException("No key set for channel model");
        }

        if (channelModel instanceof InboundChannelModel inboundChannelModel) {

            if (inboundChannelModel.getInboundEventChannelAdapter() != null) {
                InboundEventChannelAdapter inboundEventChannelAdapter = (InboundEventChannelAdapter) inboundChannelModel.getInboundEventChannelAdapter();
                inboundEventChannelAdapter.setEventRegistry(eventRegistryEngineConfiguration.getEventRegistry());
                inboundEventChannelAdapter.setInboundChannelModel(inboundChannelModel);
            }

        } else if (!(channelModel instanceof OutboundChannelModel)) {
            throw new FlowableIllegalArgumentException("Unrecognized ChannelModel class : " + channelModel.getClass());
        }

        InboundChannelModelCacheManager.ChannelRegistration channelRegistration = null;
        if (channelModel instanceof InboundChannelModel) {
            channelRegistration = eventRegistryEngineConfiguration.getInboundChannelModelCacheManager()
                    .registerChannelModel((InboundChannelModel) channelModel, channelDefinition);
        }

        boolean channelRegistered = channelRegistration == null || channelRegistration.registered();
        for (ChannelModelProcessor channelDefinitionProcessor : eventRegistryEngineConfiguration.getChannelModelProcessors()) {
            boolean canProcessChannel;
            if (channelRegistered) {
                canProcessChannel = channelDefinitionProcessor.canProcess(channelModel);
            } else {
                canProcessChannel = channelDefinitionProcessor.canProcessIfChannelModelAlreadyRegistered(channelModel);
            }

            if (canProcessChannel) {

View on GitHub (pinned to d6d39ce1c6)

Solutions

  1. Ensure the channel model in the deployment resource resolves to InboundChannelModel or OutboundChannelModel instances only.
  2. Update custom ChannelModel implementations to extend one of the supported types, or register custom deployment handling.
  3. Align Flowable module versions (event-registry vs model jars) so deserialization produces the expected concrete classes.

Example fix

// before
class MyChannelModel implements ChannelModel { ... } // unsupported
// after
class MyChannelModel extends InboundChannelModel { ... }
Defensive patterns

Strategy: validation

Validate before calling

if (!(channelModel instanceof InboundChannelModel) && !(channelModel instanceof OutboundChannelModel)) throw new IllegalArgumentException("Unsupported channel model: " + channelModel.getClass());

Type guard

boolean isSupported(ChannelModel m) { return m instanceof InboundChannelModel || m instanceof OutboundChannelModel; }

Try / catch

try { deployer.deploy(...); } catch (FlowableIllegalArgumentException e) { log.error("Unrecognized channel model class: {}", e.getMessage()); }

Prevention

When it happens

Trigger: Deploying an event registry model containing a custom or third-party ChannelModel subclass not recognized by this Flowable version, or a corrupted/incorrectly deserialized channel model whose concrete type changed.

Common situations: Upgrading Flowable where a channel model class was replaced or moved, custom framework extensions registering new channel types without extending the deployer, or classpath conflicts loading the wrong ChannelModel hierarchy.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


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