flowable/flowable-engine · error · FlowableException

No event model found for event key

Error message

No event model found for event key ${eventKey}

What it means

Thrown by DefaultInboundEventProcessingPipeline.run when an inbound event's key cannot be resolved to a deployed event definition, so no EventModel can be loaded for processing. Flowable logs the problem and throws FlowableException, aborting processing of that inbound payload. Effectively, a channel received an event whose key has no matching deployed event model.

Solutions

  1. Deploy (or restore) an event definition whose key matches eventKey for the channel's tenant.
  2. Align the inbound key extraction (InboundEventKeyDetector / channel configuration) so it produces keys that exist in the registry.
  3. Coordinate producers to stop or remap events using the removed key, or add a dead-letter/skip handler in the pipeline.
  4. Verify event definitions via EventDefinitionQuery and compare against actual inbound payloads.

Example fix

// before
pipeline.run(rawEvent); // throws if key unknown
// after
try {
    pipeline.run(rawEvent);
} catch (FlowableException e) {
    logger.warn("Skipping inbound event with unknown key", e); // or route to DLQ
}
Defensive patterns

Strategy: try-catch

Validate before calling

EventDefinition def = eventRepositoryService.createEventDefinitionQuery()
    .eventDefinitionKey(eventKey).latestVersion().singleResult();
if (def == null) logger.warn("Inbound key " + eventKey + " has no deployed event definition; skipping");

Try / catch

try {
    event = pipeline.run(rawEvent);
} catch (FlowableException e) {
    if (e.getMessage() != null && e.getMessage().startsWith("No event model found for event key")) {
        // route to dead-letter / metrics, don't crash the consumer
    } else {
        throw e;
    }
}

Prevention

When it happens

Trigger: An inbound message arrives on a channel whose key (extracted from the payload or channel key detection) does not match any deployed event definition — after removing/renaming an event model while producers still send the old key, or before the event definition is deployed.

Common situations: Renaming an event key in the event registry JSON while upstream systems still emit the old key; deploying the consumer service before its event definitions; typo or case mismatch in the key extractor configuration; events from another product/environment sharing the channel.

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/23d66ffea4ba2f81. Report an issue: GitHub.

Appendix: source

Thrown at modules/flowable-event-registry/src/main/java/org/flowable/eventregistry/impl/pipeline/DefaultInboundEventProcessingPipeline.java:140

            eventDefinitionQuery.tenantId(tenantId);
        }
        EventDefinition eventDefinition = eventDefinitionQuery.latestVersion().singleResult();
        
        if (eventDefinition == null) {
            if (eventRegistryConfiguration.isFallbackToDefaultTenant()) {
                String defaultTenant = eventRegistryConfiguration.getDefaultTenantProvider().getDefaultTenant(tenantId, ScopeTypes.EVENT_REGISTRY, eventKey);
                if (StringUtils.isNotEmpty(defaultTenant)) {
                    eventDefinition = eventRepositoryService.createEventDefinitionQuery().eventDefinitionKey(eventKey).tenantId(defaultTenant).latestVersion().singleResult();
                    
                } else {
                    eventDefinition = eventRepositoryService.createEventDefinitionQuery().eventDefinitionKey(eventKey).latestVersion().singleResult();
                }
            }
        }
        
        if (eventDefinition == null) {
            logger.error("No event model found for event key " + eventKey);
            throw new FlowableException("No event model found for event key " + eventKey);
        }
        
        EventDeployment eventDeployment = eventRepositoryService.createDeploymentQuery().deploymentId(eventDefinition.getDeploymentId()).singleResult();
        
        EventModel eventModel = eventRepositoryService.getEventModelById(eventDefinition.getId());
        
        EventInstanceImpl eventInstance = new EventInstanceImpl(
            eventModel.getKey(),
            extractPayload(eventModel, event, eventDeployment.getParentDeploymentId(), tenantId),
            tenantId
        );

        if (debugLoggingEnabled) {
            logger.debug("Transforming {} for inbound {} channel {}. Inbound event: {}", eventInstance, inboundChannel.getChannelType(),
                    inboundChannel.getKey(), inboundEvent);
        }
        Collection<EventRegistryEvent> registryEvents = transform(eventInstance);

View on GitHub (pinned to d6d39ce1c6)