flowable/flowable-engine · error · FlowableObjectNotFoundException

No channel definition found for key '' for parent deployment

Error message

No channel definition found for key '' for parent deployment id 

What it means

Thrown when resolving a channel definition by key within a given parentDeploymentId (no tenant) and neither the parent deployment nor any deployment contains a latest definition for that key. FlowableObjectNotFoundException naming key and parent deployment id.

Source

Thrown at modules/flowable-event-registry/src/main/java/org/flowable/eventregistry/impl/cmd/GetChannelModelCmd.java:111

            if (channelDefinitionEntity == null) {
                throw new FlowableObjectNotFoundException("No channel definition found for key '" + channelDefinitionKey + "' for tenant identifier " + tenantId, ChannelDefinitionEntity.class);
            }

        } else if (channelDefinitionKey != null && (tenantId == null || EventRegistryEngineConfiguration.NO_TENANT_ID.equals(tenantId)) && parentDeploymentId != null) {

            List<EventDeployment> eventDeployments = deploymentManager.getDeploymentEntityManager().findDeploymentsByQueryCriteria(
                            new EventDeploymentQueryImpl().parentDeploymentId(parentDeploymentId));
            
            if (eventDeployments != null && eventDeployments.size() > 0) {
                channelDefinitionEntity = channelDefinitionEntityManager.findChannelDefinitionByDeploymentAndKey(eventDeployments.get(0).getId(), channelDefinitionKey);
            }
            
            if (channelDefinitionEntity == null) {
                channelDefinitionEntity = channelDefinitionEntityManager.findLatestChannelDefinitionByKey(channelDefinitionKey);
            }
            
            if (channelDefinitionEntity == null) {
                throw new FlowableObjectNotFoundException("No channel definition found for key '" + channelDefinitionKey +
                        "' for parent deployment id " + parentDeploymentId, ChannelDefinitionEntity.class);
            }

        } else if (channelDefinitionKey != null && tenantId != null && !EventRegistryEngineConfiguration.NO_TENANT_ID.equals(tenantId) && parentDeploymentId != null) {

            List<EventDeployment> eventDeployments = deploymentManager.getDeploymentEntityManager().findDeploymentsByQueryCriteria(
                            new EventDeploymentQueryImpl().parentDeploymentId(parentDeploymentId).deploymentTenantId(tenantId));
            
            if (eventDeployments != null && eventDeployments.size() > 0) {
                channelDefinitionEntity = channelDefinitionEntityManager.findChannelDefinitionByDeploymentAndKeyAndTenantId(
                                eventDeployments.get(0).getId(), channelDefinitionKey, tenantId);
            }
            
            if (channelDefinitionEntity == null) {
                channelDefinitionEntity = channelDefinitionEntityManager.findLatestChannelDefinitionByKeyAndTenantId(channelDefinitionKey, tenantId);
            }
            
            if (channelDefinitionEntity == null && eventEngineConfiguration.isFallbackToDefaultTenant()) {

View on GitHub (pinned to d6d39ce1c6)

Solutions

  1. Verify the parent deployment actually contains a channel definition with that key (query its resources)
  2. Use the correct parentDeploymentId from the deployment that deployed the channel, or drop the parent filter
  3. Check the key spelling against the channel XML <channel id=...>

Example fix

// before
getChannelModel("orders", wrongParentDeploymentId, null);
// after
EventDeployment dep = repositoryService.createDeploymentQuery().deploymentName("orders-app").singleResult();
getChannelModel("orders", dep.getId(), null);
Defensive patterns

Strategy: validation

Validate before calling

EventDeployment dep = repositoryService.createDeploymentQuery()
    .deploymentId(parentDeploymentId).singleResult();
if (dep == null) throw new IllegalStateException("parent deployment " + parentDeploymentId + " does not exist");

Try / catch

try {
    return repositoryService.getChannelModel(null, key, null, parentDeploymentId);
} catch (FlowableObjectNotFoundException e) {
    LOGGER.error("channel {} not in parent deployment {}", key, parentDeploymentId);
    throw e;
}

Prevention

When it happens

Trigger: getChannelModel with channelDefinitionKey + parentDeploymentId (tenantId null) where the parent deployment's channel definitions and the latest fallback both fail to match the key.

Common situations: Passing an event-deployment's parent id while the channel belongs to a different deployment; key mismatch within the parent deployment; parent deployment id itself stale/deleted.

Understand the failure class

Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — 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/80fa48ba5e3bb2e4. Report an issue: GitHub.