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
- Ensure the channel model in the deployment resource resolves to InboundChannelModel or OutboundChannelModel instances only.
- Update custom ChannelModel implementations to extend one of the supported types, or register custom deployment handling.
- 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
- Extend InboundChannelModel/OutboundChannelModel for custom channels
- Keep Flowable model/engine jars version-aligned
- Test custom channel deployments on the target Flowable version
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
- No event definition found for event key ${sendEventServiceTa
- EventRegistryEventDefinition on '" + elementId + "' has an e
- deploymentId is null
- deployment does not exist:
- deploymentId is null
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/0c6db608cd032399.
Report an issue: GitHub.