flowable/flowable-engine · error · FlowableObjectNotFoundException
no event definitions deployed with key
Error message
no event definitions deployed with key '${eventDefinitionKey}' for tenant identifier '${tenantId}' What it means
findDeployedLatestEventDefinitionByKeyAndTenantId throws FlowableObjectNotFoundException when no event definition with the given key is deployed for the given tenant. The combined key+tenant lookup in the database returned nothing.
Solutions
- Verify the definition is deployed with that exact key and TENANT_ID_ value
- Deploy the event definition for the specific tenant if missing
- Fall back to the non-tenant lookup (findDeployedLatestEventDefinitionByKey) when the tenant-scoped lookup is allowed to miss
- Check that the tenantId passed matches how deployments set tenant (null vs empty-string semantics)
Example fix
// before
def = deploymentManager.findDeployedLatestEventDefinitionByKeyAndTenantId("order.created", tenantId);
// after
try {
def = deploymentManager.findDeployedLatestEventDefinitionByKeyAndTenantId("order.created", tenantId);
} catch (FlowableObjectNotFoundException e) {
def = deploymentManager.findDeployedLatestEventDefinitionByKey("order.created"); // tenant fallback
} Defensive patterns
Strategy: try-catch
Try / catch
try {
def = deploymentManager.findDeployedLatestEventDefinitionByKeyAndTenantId(key, tenantId);
} catch (org.flowable.common.engine.api.FlowableObjectNotFoundException e) {
def = deploymentManager.findDeployedLatestEventDefinitionByKey(key); // tenant fallback if applicable
} Prevention
- Deploy definitions per tenant for every tenant that will use them
- Normalize tenant ids (avoid null vs "" mismatches) when deploying and querying
- Log tenantId alongside the key on failure for faster diagnosis
When it happens
Trigger: Calling findDeployedLatestEventDefinitionByKeyAndTenantId with a key/tenant pair where the definition was deployed under a different tenant (or with a null/empty tenant), or not deployed at all in that tenant's scope.
Common situations: Multi-tenant setups where deployments only ran for tenant 'acme' but the runtime looks up tenant 'other'; missing tenantId propagation so the default tenant is used; definitions deployed without tenant but queried with one.
Understand the failure class
Background: Record Not Found Errors: "not found", RecordNotFound, and "was not found" — what they mean and how to fix them — this error's family across 28 libraries.
Related errors
- no channel definitions deployed with key
- no deployed channel definition found with id
- no deployed event definition found with id
- no event definitions deployed with key
- no event definitions deployed with key
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/1acdbf54e1bfe95a.
Report an issue: GitHub.
Appendix: source
Thrown at modules/flowable-event-registry/src/main/java/org/flowable/eventregistry/impl/persistence/deploy/EventDeploymentManager.java:131
eventDefinition = resolveEventDefinition(eventDefinition).getEventDefinitionEntity();
return eventDefinition;
}
public ChannelDefinitionEntity findDeployedLatestChannelDefinitionByKey(String channelDefinitionKey) {
ChannelDefinitionEntity channelDefinition = channelDefinitionEntityManager.findLatestChannelDefinitionByKey(channelDefinitionKey);
if (channelDefinition == null) {
throw new FlowableObjectNotFoundException("no channel definitions deployed with key '" + channelDefinitionKey + "'");
}
channelDefinition = resolveChannelDefinition(channelDefinition).getChannelDefinitionEntity();
return channelDefinition;
}
public EventDefinitionEntity findDeployedLatestEventDefinitionByKeyAndTenantId(String eventDefinitionKey, String tenantId) {
EventDefinitionEntity eventDefinition = eventDefinitionEntityManager.findLatestEventDefinitionByKeyAndTenantId(eventDefinitionKey, tenantId);
if (eventDefinition == null) {
throw new FlowableObjectNotFoundException("no event definitions deployed with key '" + eventDefinitionKey + "' for tenant identifier '" + tenantId + "'");
}
eventDefinition = resolveEventDefinition(eventDefinition).getEventDefinitionEntity();
return eventDefinition;
}
public EventDefinitionEntity findDeployedLatestEventDefinitionByKeyAndDeploymentId(String eventDefinitionKey, String deploymentId) {
EventDefinitionEntity eventDefinition = eventDefinitionEntityManager.findEventDefinitionByDeploymentAndKey(deploymentId, eventDefinitionKey);
if (eventDefinition == null) {
throw new FlowableObjectNotFoundException("no event definitions deployed with key '" + eventDefinitionKey +
"' for deployment id '" + deploymentId + "'");
}
eventDefinition = resolveEventDefinition(eventDefinition).getEventDefinitionEntity();
return eventDefinition;
}
public EventDefinitionEntity findDeployedLatestEventDefinitionByKeyDeploymentIdAndTenantId(String eventDefinitionKey, String deploymentId, String tenantId) {
EventDefinitionEntity eventDefinition = eventDefinitionEntityManager.findEventDefinitionByDeploymentAndKeyAndTenantId(deploymentId, eventDefinitionKey, tenantId);View on GitHub (pinned to d6d39ce1c6)