{"record":{"id":"f70b5f92db4c8c3a","repo":"flowable/flowable-engine","slug":"job-jobid-parent-is-not-cmmn-case","errorCode":null,"errorMessage":"Job {jobId} parent is not CMMN case","messagePattern":"Job (.+?) parent is not CMMN case","errorType":"validation","errorClass":"FlowableIllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/DefaultCmmnJobParentStateResolver.java","lineNumber":36,"sourceCode":"import org.flowable.common.engine.api.FlowableIllegalArgumentException;\nimport org.flowable.common.engine.api.scope.ScopeTypes;\nimport org.flowable.job.api.Job;\nimport org.flowable.job.service.InternalJobParentStateResolver;\n\n/**\n * @author martin.grofcik\n */\npublic class DefaultCmmnJobParentStateResolver implements InternalJobParentStateResolver {\n    private CmmnEngineConfiguration cmmnEngineConfiguration;\n\n    public DefaultCmmnJobParentStateResolver(CmmnEngineConfiguration cmmnEngineConfiguration) {\n        this.cmmnEngineConfiguration = cmmnEngineConfiguration;\n    }\n\n    @Override\n    public boolean isSuspended(Job job) {\n        if (!ScopeTypes.CMMN.equals(job.getScopeType()) || StringUtils.isEmpty(job.getScopeId())) {\n            throw new FlowableIllegalArgumentException(\"Job \"+ job.getId() +\" parent is not CMMN case\");\n        }\n        CaseInstance caseInstance = this.cmmnEngineConfiguration.cmmnRuntimeService.createCaseInstanceQuery().caseInstanceId(job.getScopeId()).singleResult();\n        return CaseInstanceState.SUSPENDED.equals(caseInstance.getState());\n    }\n}\n","sourceCodeStart":18,"sourceCodeEnd":42,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/DefaultCmmnJobParentStateResolver.java#L18-L42","documentation":"Thrown by DefaultCmmnJobParentStateResolver.isSuspended when a job's scopeType is not 'cmmn' or its scopeId is empty, i.e. the job's parent is not a CMMN case instance. This resolver only knows how to determine suspension state via a CMMN case instance, so non-CMMN jobs are rejected with FlowableIllegalArgumentException.","triggerScenarios":"Job service invoking a registered suspension-state resolver for a job whose scopeType is not ScopeTypes.CMMN (e.g. a BPMN/async-executor job) or whose scopeId is null/empty.","commonSituations":"Deploying the CMMN engine alongside other engines and letting DefaultCmmnJobParentStateResolver handle jobs it shouldn't; jobs created without scopeType/scopeId populated (data migration or older data); misconfigured job service resolver wiring.","solutions":["Ensure only CMMN-scoped jobs are routed to this resolver (register per-scope resolvers correctly)","Check the job row in the DB: ACT_RU_JOB.SCOPE_TYPE_ should be 'cmmn' and SCOPE_ID_ set to the case instance id","Re-create or repair jobs missing scopeType/scopeId after migrations","If the job legitimately belongs to another engine, use that engine's resolver instead"],"exampleFix":"// before\nboolean suspended = defaultCmmnJobParentStateResolver.isSuspended(job); // job scopeType=bpmn\n// after\nif (ScopeTypes.CMMN.equals(job.getScopeType()) && job.getScopeId() != null) {\n    boolean suspended = defaultCmmnJobParentStateResolver.isSuspended(job);\n}","handlingStrategy":"type-guard","validationCode":"if (!\"cmmn\".equals(job.getScopeType()) || job.getScopeId() == null || job.getScopeId().isEmpty()) { /* route to correct resolver */ }","typeGuard":"boolean isCmmnJob(Job job) { return \"cmmn\".equals(job.getScopeType()) && job.getScopeId() != null && !job.getScopeId().isEmpty(); }","tryCatchPattern":"try { return resolver.isSuspended(job); } catch (FlowableIllegalArgumentException e) { log.warn(\"non-CMMN job {}: route to correct resolver\", job.getId()); return false; }","preventionTips":["Register scope-specific suspension resolvers instead of one global resolver","Validate job scopeType/scopeId columns after data migrations","Only feed CMMN-scoped jobs to CMMN services"],"tags":["java","cmmn","job","validation"],"backgroundTag":"invalid-argument-value","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}