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

  1. Verify the subscription: runtimeService.createEventSubscriptionQuery().eventName(eventName).executionId(executionId).list() should be non-empty.
  2. Correct the signal name to match the BPMN definition exactly.
  3. 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

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


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)