flowable/flowable-engine · error · ActivitiException
Execution ' ' has not subscribed to a signal event with…
Error message
Execution '<executionId>' has not subscribed to a signal event with name '<eventName>'.
What it means
SignalEventReceivedCmd throws ActivitiException when the execution has no signal event subscription matching the given event name. Signals are deliverable only to executions currently waiting at a signal-catching intermediate or boundary event with that name. Note the targeted delivery also only routes globally scoped signals; process-instance-scoped subscriptions are invisible to this API.
Solutions
- Verify the subscription: runtimeService.createEventSubscriptionQuery().eventName(eventName).executionId(executionId).list() should be non-empty.
- Correct the signal name to match the BPMN definition exactly.
- For process-instance-scoped signals, trigger them from within the process (e.g. a service task) instead of the external API.
Example fix
// before
runtimeService.signalEventReceived("Order Approved", executionId);
// after
if (!runtimeService.createEventSubscriptionQuery().eventName("order-approved").executionId(executionId).list().isEmpty()) {
runtimeService.signalEventReceived("order-approved", executionId);
} Defensive patterns
Strategy: validation
Validate before calling
boolean subscribed = !runtimeService.createEventSubscriptionQuery()
.eventName(eventName).executionId(executionId).list().isEmpty();
if (subscribed) runtimeService.signalEventReceived(eventName, executionId); Try / catch
try {
runtimeService.signalEventReceived(eventName, executionId);
} catch (ActivitiException e) {
logger.warn("Execution {} not waiting on signal '{}'", executionId, eventName, e);
} Prevention
- Copy signal names from the BPMN file into constants; never free-type them.
- Check EventSubscriptionQuery before signaling.
- Remember process-instance-scoped signals must be thrown inside the process itself.
When it happens
Trigger: Calling runtimeService.signalEventReceived(eventName, executionId) where the execution is not waiting on a signal named eventName, or is waiting only on a process-instance-scoped signal.
Common situations: Typo in the signal name differing from the bpmn:signal name; execution already passed the catch event; subscription deleted by boundary-event interruption; attempting to throw an instance-scoped signal from outside the process.
Understand the failure class
Background: "Not found" and "does not exist" errors: why "Task not found", "No such folder", and "Can't find" fire when a lookup comes back empty — this error's family across 14 libraries.
Related errors
- Cannot find execution with id
- Cannot start process instance by message: no subscription…
- Cannot throw signal event
- A delegated task cannot be completed, but should be…
- Can not activate job
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/11625c6d92ac35f9.
Report an issue: GitHub.
Appendix: source
Thrown at modules/flowable5-engine/src/main/java/org/activiti/engine/impl/cmd/SignalEventReceivedCmd.java:89
signalEvents = commandContext.getEventSubscriptionEntityManager().findSignalEventSubscriptionsByEventName(eventName, tenantId);
} else {
ExecutionEntity execution = commandContext.getExecutionEntityManager().findExecutionById(executionId);
if (execution == null) {
throw new ActivitiObjectNotFoundException("Cannot find execution with id '" + executionId + "'", Execution.class);
}
if (execution.isSuspended()) {
throw new ActivitiException("Cannot throw signal event '" + eventName
+ "' because execution '" + executionId + "' is suspended");
}
signalEvents = commandContext.getEventSubscriptionEntityManager().findSignalEventSubscriptionsByNameAndExecution(eventName, executionId);
if (signalEvents.isEmpty()) {
throw new ActivitiException("Execution '" + executionId + "' has not subscribed to a signal event with name '" + eventName + "'.");
}
}
for (SignalEventSubscriptionEntity signalEventSubscriptionEntity : signalEvents) {
// We only throw the event to globally scoped signals.
// Process instance scoped signals must be thrown within the process itself
if (signalEventSubscriptionEntity.isGlobalScoped()) {
signalEventSubscriptionEntity.eventReceived(payload, async);
}
}
return null;
}
}
View on GitHub (pinned to d6d39ce1c6)