{"record":{"id":"d5de469c8f37c343","repo":"flowable/flowable-engine","slug":"cannot-unacquire-cmmn-job-there-is-no-cmmn-engine","errorCode":null,"errorMessage":"Cannot unacquire CMMN job. There is no CMMN engine available","messagePattern":"Cannot unacquire CMMN job\\. There is no CMMN engine available","errorType":"exception","errorClass":"FlowableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-external-job-rest/src/main/java/org/flowable/external/job/rest/service/api/acquire/ExternalWorkerUnacquireJobResource.java","lineNumber":105,"sourceCode":"                if (restApiInterceptor != null) {\n                    restApiInterceptor.unacquireExternalWorkerJob(job, request);\n                }\n\n                managementService.unacquireExternalWorkerJob(jobId, workerId);\n                \n            } else {\n                throw new FlowableException(\"Cannot unacquire BPMN job. There is no BPMN engine available\");\n            }\n        } else if (ScopeTypes.CMMN.equals(job.getScopeType())) {\n            if (cmmnManagementService != null) {\n                if (restApiInterceptor != null) {\n                    restApiInterceptor.unacquireExternalWorkerJob(job, request);\n                }\n\n                cmmnManagementService.unacquireExternalWorkerJob(jobId, workerId);\n                \n            } else {\n                throw new FlowableException(\"Cannot unacquire CMMN job. There is no CMMN engine available\");\n            }\n            \n        } else {\n            throw new FlowableIllegalArgumentException(\n                    \"Can only unacquire BPMN or CMMN external job. Job with id '\" + jobId + \"' is from scope '\" + job.getScopeType() + \"'\");\n        }\n\n        return ResponseEntity.noContent().build();\n    }\n    \n    protected void unaquireExternalWorkerJobs(String workerId, String tenantId) {\n        if (managementService != null) {\n            if (StringUtils.isNotEmpty(tenantId)) {\n                managementService.unacquireAllExternalWorkerJobsForWorker(workerId, tenantId);\n            } else {\n                managementService.unacquireAllExternalWorkerJobsForWorker(workerId);\n            }\n            ","sourceCodeStart":87,"sourceCodeEnd":123,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-external-job-rest/src/main/java/org/flowable/external/job/rest/service/api/acquire/ExternalWorkerUnacquireJobResource.java#L87-L123","documentation":"FlowableException thrown by unaquireJob when the job is CMMN-scoped but the cmmnManagementService is null. The engine required to release the CMMN external worker job lock is not configured in the REST resource. Same pattern as the BPMN-side check.","triggerScenarios":"POST /external-worker-job/unacquire/jobs/{jobId} for a job with scopeType CMMN where the CMMN engine's management service is not wired into the resource.","commonSituations":"Process-only deployments that still have CMMN jobs in the database; CMMN engine auto-configuration disabled; standalone REST module without engine beans.","solutions":["Enable/configure the CMMN engine so cmmnManagementService is injected.","Remove stale CMMN external worker jobs if the CMMN engine is intentionally absent.","Confirm the deployment's engine auto-configuration includes flowable.cmmn.enabled=true."],"exampleFix":"// before\nflowable:\n  cmmn:\n    enabled: false\n// after\nflowable:\n  cmmn:\n    enabled: true","handlingStrategy":"fallback","validationCode":"boolean canUnacquireCmmn = cmmnEngine != null; // verify before handling CMMN-scoped jobs","typeGuard":null,"tryCatchPattern":"try { unaquireJob(jobId, request); } catch (FlowableException e) { if (e.getMessage().contains(\"no CMMN engine\")) { alertOps(\"CMMN engine not configured\"); } else { throw e; } }","preventionTips":["Enable the CMMN engine when case external worker jobs exist","Purge stale CMMN jobs on process-only deployments","Verify flowable.cmmn.enabled in configuration"],"tags":["configuration","engine","cmmn","rest-api"],"backgroundTag":"missing-dependency","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-18T11:17:12.947Z"}