{"record":{"id":"f709d26a8e6e3177","repo":"flowable/flowable-engine","slug":"couldn-t-process-signal-signalname-on-activit","errorCode":null,"errorMessage":"couldn't process signal '${signalName}' on activity '${activityId}': ","messagePattern":"couldn't process signal '(.+?)' on activity '(.+?)': ","errorType":"exception","errorClass":"PvmException","httpStatus":null,"severity":"error","filePath":"modules/flowable5-engine/src/main/java/org/activiti/engine/impl/pvm/runtime/ExecutionImpl.java","lineNumber":574,"sourceCode":"    public void start() {\n        if (startingExecution == null && isProcessInstanceType()) {\n            startingExecution = new StartingExecution(processDefinition.getInitial());\n        }\n        performOperation(AtomicOperation.PROCESS_START);\n    }\n\n    // methods that translate to operations /////////////////////////////////////\n\n    @Override\n    public void signal(String signalName, Object signalData) {\n        ensureActivityInitialized();\n        SignallableActivityBehavior activityBehavior = (SignallableActivityBehavior) activity.getActivityBehavior();\n        try {\n            activityBehavior.signal(this, signalName, signalData);\n        } catch (RuntimeException e) {\n            throw e;\n        } catch (Exception e) {\n            throw new PvmException(\"couldn't process signal '\" + signalName + \"' on activity '\" + activity.getId() + \"': \" + e.getMessage(), e);\n        }\n    }\n\n    @Override\n    public void take(PvmTransition transition, boolean fireActivityCompletedEvent) {\n        // No event firing on executionlevel impl\n        take(transition);\n    }\n\n    @Override\n    public void take(PvmTransition transition) {\n        if (this.transition != null) {\n            throw new PvmException(\"already taking a transition\");\n        }\n        if (transition == null) {\n            throw new PvmException(\"transition is null\");\n        }\n        setTransition((TransitionImpl) transition);","sourceCodeStart":556,"sourceCodeEnd":592,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable5-engine/src/main/java/org/activiti/engine/impl/pvm/runtime/ExecutionImpl.java#L556-L592","documentation":"Thrown when a SignallableActivityBehavior.signal(execution, signalName, signalData) throws a checked Exception while the execution is being signalled (e.g. resuming a wait state). The PVM wraps it in a PvmException with the signal name and activity id. Runtime exceptions are rethrown as-is.","triggerScenarios":"runtimeService.signal(executionId) or signal variants reaching a wait-state activity (receive task, user task gateway) whose SignallableActivityBehavior.signal() throws a checked exception; also custom signallable behaviors with checked failure paths.","commonSituations":"Signalling an execution whose underlying behavior touches external systems; custom wait-state implementations throwing checked IO exceptions; signalling the wrong execution id so the resolved activity's signal logic fails.","solutions":["Inspect the cause of the PvmException to identify the failing behavior","Fix the checked-exception path inside the activity's signal() implementation","Catch/wrap checked exceptions in the behavior before they reach the engine","Verify the executionId being signalled corresponds to the expected wait state"],"exampleFix":"// before\npublic void signal(DelegateExecution exec, String signalName, Object data) throws Exception {\n  queue.send(signalName, data); // throws checked Exception\n}\n// after\npublic void signal(DelegateExecution exec, String signalName, Object data) {\n  try { queue.send(signalName, data); }\n  catch (Exception e) { throw new ActivitiException(\"signal delivery failed\", e); }\n}","handlingStrategy":"try-catch","validationCode":"// confirm execution is actually waiting before signalling\nExecution e = runtimeService.createExecutionQuery().executionId(id).singleResult();\nif (e == null) throw new IllegalArgumentException(\"execution not found: \" + id);","typeGuard":"if (activityBehavior instanceof SignallableActivityBehavior) { ... }","tryCatchPattern":"try {\n  runtimeService.signal(executionId, signalName, data);\n} catch (PvmException e) {\n  log.error(\"signal {} failed\", signalName, e.getCause());\n}","preventionTips":["Wrap checked exceptions inside SignallableActivityBehavior.signal()","Query the execution/activity state before signalling","Use runtimeService.createExecutionQuery() to validate wait states"],"tags":["process-engine","signal","wrapped-exception"],"backgroundTag":"upstream-api-error","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"}