{"record":{"id":"9c3151a4efd03991","repo":"flowable/flowable-engine","slug":"cannot-propagate-escalation-escalationname","errorCode":null,"errorMessage":"Cannot propagate escalation '\" + escalationName + \"' with code '\" + escalationCode + \"', because \" + boundaryExecution + \" is suspended","messagePattern":"Cannot propagate escalation '\" \\+ escalationName \\+ \"' with code '\" \\+ escalationCode \\+ \"', because \" \\+ boundaryExecution \\+ \" is suspended","errorType":"exception","errorClass":"FlowableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-engine/src/main/java/org/flowable/engine/impl/bpmn/helper/EscalationPropagation.java","lineNumber":217,"sourceCode":"            ExecutionEntityManager executionEntityManager = CommandContextUtil.getExecutionEntityManager();\n\n            ExecutionEntity eventSubProcessExecution = executionEntityManager.createChildExecution(parentExecution);\n            eventSubProcessExecution.setCurrentFlowElement(event.getSubProcess() != null ? event.getSubProcess() : event);\n            CommandContextUtil.getAgenda().planContinueProcessOperation(eventSubProcessExecution);\n\n        } else {\n            ExecutionEntity boundaryExecution = null;\n            List<? extends ExecutionEntity> childExecutions = parentExecution.getExecutions();\n            for (ExecutionEntity childExecution : childExecutions) {\n                if (childExecution != null\n                        && childExecution.getActivityId() != null\n                        && childExecution.getActivityId().equals(event.getId())) {\n                    boundaryExecution = childExecution;\n                }\n            }\n            \n            if (boundaryExecution != null && boundaryExecution.isSuspended()) {\n                throw new FlowableException(\n                        \"Cannot propagate escalation '\" + escalationName + \"' with code '\" + escalationCode + \"', because \" + boundaryExecution\n                                + \" is suspended\");\n            }\n\n            CommandContextUtil.getAgenda().planTriggerExecutionOperation(boundaryExecution);\n        }\n    }\n\n    protected static Map<String, List<Event>> findCatchingEventsForProcess(String processDefinitionId, String escalationCode) {\n        Map<String, List<Event>> eventMap = new HashMap<>();\n        Process process = ProcessDefinitionUtil.getProcess(processDefinitionId);\n        BpmnModel bpmnModel = ProcessDefinitionUtil.getBpmnModel(processDefinitionId);\n\n        List<EventSubProcess> subProcesses = process.findFlowElementsOfType(EventSubProcess.class, true);\n        for (EventSubProcess eventSubProcess : subProcesses) {\n            for (FlowElement flowElement : eventSubProcess.getFlowElements()) {\n                if (flowElement instanceof StartEvent startEvent) {\n                    if (CollectionUtil.isNotEmpty(startEvent.getEventDefinitions()) && startEvent.getEventDefinitions()","sourceCodeStart":199,"sourceCodeEnd":235,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-engine/src/main/java/org/flowable/engine/impl/bpmn/helper/EscalationPropagation.java#L199-L235","documentation":"EscalationPropagation.executeEventHandler throws this when a thrown escalation is caught by a boundary escalation event whose execution is currently suspended. The engine refuses to deliver the escalation into a suspended scope, since resumed processing of a suspended execution is not allowed.","triggerScenarios":"A subprocess (or call activity) throws an escalation; a boundary escalation event on that subprocess matches (by escalation code or default catch), but the childExecution holding the boundary event subscription is suspended (e.g. via RuntimeService.suspendProcessInstanceById or suspendJob for the scope).","commonSituations":"Suspending a process instance for maintenance/BAU hold while it (or its subprocess) later throws an escalation; suspension state persisted across restarts colliding with an incoming escalation from a call activity; resuming logic that activates the parent but not the child execution holding the boundary subscription.","solutions":["Resume the suspended execution/process instance (RuntimeService.activateProcessInstanceById / activate the relevant scope) before the escalation is thrown.","If suspension is intentional, delay or suppress the escalation source (e.g. gate the throwEscalation path) until the scope is active.","Check suspension state programmatically before triggering the escalation: query the execution and skip/queue if ExecutionEntity.isSuspended().","Review which execution was suspended — suspending the parent instance suspends children; activate children explicitly if only the parent should resume."],"exampleFix":"// before\nruntimeService.throwEscalation(processInstanceId, \"escalationCode\"); // may hit suspended boundary execution\n\n// after\nif (!runtimeService.createProcessInstanceQuery().processInstanceId(id).singleResult().isSuspended()) {\n    runtimeService.throwEscalation(id, \"escalationCode\");\n} else {\n    runtimeService.activateProcessInstanceById(id); // then throw\n}","handlingStrategy":"validation","validationCode":"ProcessInstance pi = runtimeService.createProcessInstanceQuery()\n        .processInstanceId(piId).singleResult();\nif (pi != null && pi.isSuspended()) {\n    runtimeService.activateProcessInstanceById(piId); // before throwing escalation\n}","typeGuard":null,"tryCatchPattern":"try {\n    runtimeService.throwEscalation(piId, code);\n} catch (FlowableException e) {\n    if (e.getMessage().contains(\"is suspended\")) {\n        runtimeService.activateProcessInstanceById(piId);\n    }\n}","preventionTips":["Check isSuspended() on the target instance before throwing escalations.","Align suspension/resumption lifecycle with escalation sources.","Include subprocess/call-activity scopes in suspension audits."],"tags":["flowable","bpmn","escalation","suspended-execution","boundary-event"],"backgroundTag":"invalid-state-transition","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}