{"record":{"id":"4b2cd94f35e3df99","repo":"flowable/flowable-engine","slug":"could-not-find-a-deployment-with-id-deploymentid-4b2cd9","errorCode":null,"errorMessage":"Could not find a deployment with id '<deploymentId>'.","messagePattern":"Could not find a deployment with id '<deploymentId>'\\.","errorType":"exception","errorClass":"FlowableObjectNotFoundException","httpStatus":null,"severity":"error","filePath":"modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/deployer/CmmnDeploymentManager.java","lineNumber":131,"sourceCode":"            deployment.setNew(false);\n            deploy(deployment, null);\n            cachedCaseDefinition = deployment.getCaseDefinitionCacheEntry(caseDefinitionId);\n\n            if (cachedCaseDefinition == null) {\n                throw new FlowableException(\"deployment '\" + deploymentId + \"' didn't put case definition '\" + caseDefinitionId + \"' in the cache\");\n            }\n        }\n        return cachedCaseDefinition;\n    }\n    \n    public void removeDeployment(String deploymentId) {\n        removeDeployment(deploymentId, true);\n    }\n    \n    public void removeDeployment(String deploymentId, boolean cascade) {\n        CmmnDeploymentEntity deployment = deploymentEntityManager.findById(deploymentId);\n        if (deployment == null) {\n            throw new FlowableObjectNotFoundException(\"Could not find a deployment with id '\" + deploymentId + \"'.\", CmmnDeploymentEntity.class);\n        }\n        \n        List<EngineDeployer> engineUnDeployers = new ArrayList<>(deployers);\n        engineUnDeployers.sort(Comparator.comparingInt(EngineDeployer::getUndeployOrder));\n\n        for (EngineDeployer deployer : engineUnDeployers) {\n            deployer.undeploy(deployment, cascade);\n        }\n\n        List<CaseDefinition> caseDefinitions = new CaseDefinitionQueryImpl().deploymentId(deploymentId).list();\n\n        deploymentEntityManager.deleteDeploymentAndRelatedData(deploymentId, cascade);\n\n        FlowableEventDispatcher eventDispatcher = cmmnEngineConfiguration.getEventDispatcher();\n        for (CaseDefinition caseDefinition : caseDefinitions) {\n            caseDefinitionCache.remove(caseDefinition.getId());\n            if (eventDispatcher != null && eventDispatcher.isEnabled()) {\n                eventDispatcher.dispatchEvent(new FlowableEntityEventImpl(caseDefinition, FlowableEngineEventType.DEFINITION_UNDEPLOYED),","sourceCodeStart":113,"sourceCodeEnd":149,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/deployer/CmmnDeploymentManager.java#L113-L149","documentation":"removeDeployment(deploymentId, cascade) first loads the deployment entity by id. If no deployment with that id exists, it throws FlowableObjectNotFoundException for CmmnDeploymentEntity before any undeploy logic runs. Idempotent deletion is not built in — callers must handle the not-found case.","triggerScenarios":"Calling CmmnRepositoryService.deleteDeployment(id) with a wrong, already-deleted, or foreign-engine deployment id; deleting twice after a first successful delete; using a process deployment id against the CMMN engine.","commonSituations":"Scripts re-running undeploy steps after a failure mid-way; typo'd or hard-coded ids; CI cleanup jobs racing each other to delete the same deployment.","solutions":["Query first: cmmnRepositoryService.createDeploymentQuery().deploymentId(id).singleResult() and skip deletion when null","Wrap the delete in try-catch for FlowableObjectNotFoundException and treat it as already deleted","Verify the id came from the CMMN repository, not the BPMN/process repository"],"exampleFix":"// before\ncmmnRepositoryService.deleteDeployment(deploymentId); // throws if missing\n// after\nif (cmmnRepositoryService.createDeploymentQuery().deploymentId(deploymentId).singleResult() != null) {\n    cmmnRepositoryService.deleteDeployment(deploymentId, true);\n}","handlingStrategy":"try-catch","validationCode":"boolean exists = repositoryService.createDeploymentQuery().deploymentId(deploymentId).count() > 0;","typeGuard":null,"tryCatchPattern":"try { repositoryService.deleteDeployment(id, cascade); } catch (FlowableObjectNotFoundException e) { log.info(\"Deployment {} already gone\", id); }","preventionTips":["Make undeploy scripts idempotent by checking existence first","Use distinct id sources for CMMN vs process deployments"],"tags":["not-found","deployment","delete","idempotency"],"backgroundTag":"record-not-found","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-18T16:30:33.424Z"}