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

  1. Verify deployment used .tenantId("tenant-42") when deploying the definition
  2. Query with tenant: repositoryService.createProcessDefinitionQuery().processDefinitionTenantId(t).processDefinitionKey(key).list()
  3. If the definition should be tenant-agnostic, deploy with .tenantId(...) for each tenant or drop the tenant qualifier from the start call
  4. 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

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


AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11). Data as JSON: /api/errors/d1005b6b96071c3a. Report an issue: GitHub.