flowable/flowable-engine · error · FlowableObjectNotFoundException
no processes deployed with key '" + processDefinitionKey + "
Error message
no processes deployed with key '" + processDefinitionKey + "' for tenant identifier '" + tenantId + "'
What it means
Same lookup as the by-key variant, but scoped to a tenant: findDeployedLatestProcessDefinitionByKeyAndTenantId queries for the latest definition with the given key AND tenantId, throwing FlowableObjectNotFoundException when none exists. The combination of key and tenant identifier must match a deployed row exactly.
Source
Thrown at modules/flowable-engine/src/main/java/org/flowable/engine/impl/persistence/deploy/DeploymentManager.java:98
processDefinition = resolveProcessDefinition(processDefinition).getProcessDefinition();
}
return processDefinition;
}
public ProcessDefinition findDeployedLatestProcessDefinitionByKey(String processDefinitionKey) {
ProcessDefinition processDefinition = processDefinitionEntityManager.findLatestProcessDefinitionByKey(processDefinitionKey);
if (processDefinition == null) {
throw new FlowableObjectNotFoundException("no processes deployed with key '" + processDefinitionKey + "'", ProcessDefinition.class);
}
processDefinition = resolveProcessDefinition(processDefinition).getProcessDefinition();
return processDefinition;
}
public ProcessDefinition findDeployedLatestProcessDefinitionByKeyAndTenantId(String processDefinitionKey, String tenantId) {
ProcessDefinition processDefinition = processDefinitionEntityManager.findLatestProcessDefinitionByKeyAndTenantId(processDefinitionKey, tenantId);
if (processDefinition == null) {
throw new FlowableObjectNotFoundException("no processes deployed with key '" + processDefinitionKey + "' for tenant identifier '" + tenantId + "'", ProcessDefinition.class);
}
processDefinition = resolveProcessDefinition(processDefinition).getProcessDefinition();
return processDefinition;
}
public ProcessDefinition findDeployedProcessDefinitionByKeyAndVersionAndTenantId(String processDefinitionKey, Integer processDefinitionVersion, String tenantId) {
ProcessDefinition processDefinition = (ProcessDefinitionEntity) processDefinitionEntityManager
.findProcessDefinitionByKeyAndVersionAndTenantId(processDefinitionKey, processDefinitionVersion, tenantId);
if (processDefinition == null) {
throw new FlowableObjectNotFoundException("no processes deployed with key = '" + processDefinitionKey + "' and version = '" + processDefinitionVersion + "'", ProcessDefinition.class);
}
processDefinition = resolveProcessDefinition(processDefinition).getProcessDefinition();
return processDefinition;
}
/**
* Resolving the process definition will fetch the BPMN 2.0, parse it and store the {@link BpmnModel} in memory.
*/View on GitHub (pinned to d6d39ce1c6)
Solutions
- Verify deployment used .tenantId("tenant-42") when deploying the definition
- Query with tenant: repositoryService.createProcessDefinitionQuery().processDefinitionTenantId(t).processDefinitionKey(key).list()
- If the definition should be tenant-agnostic, deploy with .tenantId(...) for each tenant or drop the tenant qualifier from the start call
- Check exact tenant id spelling/case
Example fix
// before
repositoryService.createDeployment().addClasspathResource("order.bpmn20.xml").deploy();
// tenant-scoped start then fails
runtimeService.startProcessInstanceByKey("order").processDefinitionTenantId("acme").start();
// after
repositoryService.createDeployment().addClasspathResource("order.bpmn20.xml").tenantId("acme").deploy();
runtimeService.startProcessInstanceByKey("order").processDefinitionTenantId("acme").start(); Defensive patterns
Strategy: validation
Validate before calling
boolean deployed = repositoryService.createProcessDefinitionQuery()
.processDefinitionKey(key)
.processDefinitionTenantId(tenantId).count() > 0; Prevention
- Always set .tenantId(...) when deploying in multi-tenant setups
- Normalize/trim tenant ids before use
- Add per-tenant deployment smoke checks
When it happens
Trigger: runtimeService.startProcessInstanceByKey(key).processDefinitionTenantId("tenant-42").start() where the tenant-42 deployment is missing, or a definition was deployed with a different/empty tenant id than the one passed.
Common situations: Multi-tenant setups where one tenant's definitions were deployed but not another's; deployment done without .tenantId(...) so it landed under the default empty tenant; case-sensitivity or trailing-whitespace differences in tenant ids.
Understand the failure class
Background: "Not found" and "does not exist" errors: why "Task not found", "No such folder", and "Can't find" fire when a lookup comes back empty — this error's family across 14 libraries.
Related errors
- No process definition found for name:
- Process definition ${processDefinitionKey} was not found in
- No process definition found for key '{processDefinitionKey}'
- No process definition found for key '{processDefinitionKey}'
- Process definition with key '{processDefinitionKey}' and ten
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/d1005b6b96071c3a.
Report an issue: GitHub.