flowable/flowable-engine · error · FlowableException

Cannot unacquire CMMN job. There is no CMMN engine available

Error message

Cannot unacquire CMMN job. There is no CMMN engine available

What it means

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.

Solutions

  1. Enable/configure the CMMN engine so cmmnManagementService is injected.
  2. Remove stale CMMN external worker jobs if the CMMN engine is intentionally absent.
  3. Confirm the deployment's engine auto-configuration includes flowable.cmmn.enabled=true.

Example fix

// before
flowable:
  cmmn:
    enabled: false
// after
flowable:
  cmmn:
    enabled: true
Defensive patterns

Strategy: fallback

Validate before calling

boolean canUnacquireCmmn = cmmnEngine != null; // verify before handling CMMN-scoped jobs

Try / catch

try { unaquireJob(jobId, request); } catch (FlowableException e) { if (e.getMessage().contains("no CMMN engine")) { alertOps("CMMN engine not configured"); } else { throw e; } }

Prevention

When it happens

Trigger: 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.

Common situations: Process-only deployments that still have CMMN jobs in the database; CMMN engine auto-configuration disabled; standalone REST module without engine beans.

Understand the failure class

Background: "not installed", "pip install", "required for": how missing-dependency errors surface across open-source libraries — this error's family across 34 libraries.

Related errors


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

Appendix: source

Thrown at modules/flowable-external-job-rest/src/main/java/org/flowable/external/job/rest/service/api/acquire/ExternalWorkerUnacquireJobResource.java:105

                if (restApiInterceptor != null) {
                    restApiInterceptor.unacquireExternalWorkerJob(job, request);
                }

                managementService.unacquireExternalWorkerJob(jobId, workerId);
                
            } else {
                throw new FlowableException("Cannot unacquire BPMN job. There is no BPMN engine available");
            }
        } else if (ScopeTypes.CMMN.equals(job.getScopeType())) {
            if (cmmnManagementService != null) {
                if (restApiInterceptor != null) {
                    restApiInterceptor.unacquireExternalWorkerJob(job, request);
                }

                cmmnManagementService.unacquireExternalWorkerJob(jobId, workerId);
                
            } else {
                throw new FlowableException("Cannot unacquire CMMN job. There is no CMMN engine available");
            }
            
        } else {
            throw new FlowableIllegalArgumentException(
                    "Can only unacquire BPMN or CMMN external job. Job with id '" + jobId + "' is from scope '" + job.getScopeType() + "'");
        }

        return ResponseEntity.noContent().build();
    }
    
    protected void unaquireExternalWorkerJobs(String workerId, String tenantId) {
        if (managementService != null) {
            if (StringUtils.isNotEmpty(tenantId)) {
                managementService.unacquireAllExternalWorkerJobsForWorker(workerId, tenantId);
            } else {
                managementService.unacquireAllExternalWorkerJobsForWorker(workerId);
            }
            

View on GitHub (pinned to d6d39ce1c6)