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
- Deploy (or restore) an event definition whose key matches eventKey for the channel's tenant.
- Align the inbound key extraction (InboundEventKeyDetector / channel configuration) so it produces keys that exist in the registry.
- Coordinate producers to stop or remap events using the removed key, or add a dead-letter/skip handler in the pipeline.
- 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
- Never rename or delete event keys without coordinating with producers.
- Deploy event definitions before starting inbound channel consumers.
- Log and monitor unknown inbound keys to catch producer/registry drift early.
- Validate key extractor configuration against actual payloads in staging.
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
- Could not find a deployment with id
- Could not find deployment with id
- Could not find deployment with id
- Could not find event model with key
- deployment does not exist:
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)