{"record":{"id":"0c6db608cd032399","repo":"flowable/flowable-engine","slug":"unrecognized-channelmodel-class-channelmodel-g","errorCode":null,"errorMessage":"Unrecognized ChannelModel class : ${channelModel.getClass()}","messagePattern":"Unrecognized ChannelModel class : (.+?)","errorType":"validation","errorClass":"FlowableIllegalArgumentException","httpStatus":400,"severity":"error","filePath":"modules/flowable-event-registry/src/main/java/org/flowable/eventregistry/impl/deployer/CachingAndArtifactsManager.java","lineNumber":94,"sourceCode":"        }\n    }\n    \n    public void registerChannelModel(ChannelModel channelModel, ChannelDefinition channelDefinition, EventRegistryEngineConfiguration eventRegistryEngineConfiguration) {\n        String channelDefinitionKey = channelModel.getKey();\n        if (StringUtils.isEmpty(channelDefinitionKey)) {\n            throw new FlowableIllegalArgumentException(\"No key set for channel model\");\n        }\n\n        if (channelModel instanceof InboundChannelModel inboundChannelModel) {\n\n            if (inboundChannelModel.getInboundEventChannelAdapter() != null) {\n                InboundEventChannelAdapter inboundEventChannelAdapter = (InboundEventChannelAdapter) inboundChannelModel.getInboundEventChannelAdapter();\n                inboundEventChannelAdapter.setEventRegistry(eventRegistryEngineConfiguration.getEventRegistry());\n                inboundEventChannelAdapter.setInboundChannelModel(inboundChannelModel);\n            }\n\n        } else if (!(channelModel instanceof OutboundChannelModel)) {\n            throw new FlowableIllegalArgumentException(\"Unrecognized ChannelModel class : \" + channelModel.getClass());\n        }\n\n        InboundChannelModelCacheManager.ChannelRegistration channelRegistration = null;\n        if (channelModel instanceof InboundChannelModel) {\n            channelRegistration = eventRegistryEngineConfiguration.getInboundChannelModelCacheManager()\n                    .registerChannelModel((InboundChannelModel) channelModel, channelDefinition);\n        }\n\n        boolean channelRegistered = channelRegistration == null || channelRegistration.registered();\n        for (ChannelModelProcessor channelDefinitionProcessor : eventRegistryEngineConfiguration.getChannelModelProcessors()) {\n            boolean canProcessChannel;\n            if (channelRegistered) {\n                canProcessChannel = channelDefinitionProcessor.canProcess(channelModel);\n            } else {\n                canProcessChannel = channelDefinitionProcessor.canProcessIfChannelModelAlreadyRegistered(channelModel);\n            }\n\n            if (canProcessChannel) {","sourceCodeStart":76,"sourceCodeEnd":112,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-event-registry/src/main/java/org/flowable/eventregistry/impl/deployer/CachingAndArtifactsManager.java#L76-L112","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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."],"exampleFix":"// before\nclass MyChannelModel implements ChannelModel { ... } // unsupported\n// after\nclass MyChannelModel extends InboundChannelModel { ... }","handlingStrategy":"validation","validationCode":"if (!(channelModel instanceof InboundChannelModel) && !(channelModel instanceof OutboundChannelModel)) throw new IllegalArgumentException(\"Unsupported channel model: \" + channelModel.getClass());","typeGuard":"boolean isSupported(ChannelModel m) { return m instanceof InboundChannelModel || m instanceof OutboundChannelModel; }","tryCatchPattern":"try { deployer.deploy(...); } catch (FlowableIllegalArgumentException e) { log.error(\"Unrecognized channel model class: {}\", e.getMessage()); }","preventionTips":["Extend InboundChannelModel/OutboundChannelModel for custom channels","Keep Flowable model/engine jars version-aligned","Test custom channel deployments on the target Flowable version"],"tags":["flowable","event-registry","unsupported-type","deployment"],"backgroundTag":"unsupported-operation","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}