flowable/flowable-engine · warning

event definitions only allowed on start event if subprocess

Error message

event definitions only allowed on start event if subprocess is an event subprocess {}

What it means

This warning is raised during BPMN parsing when a start event inside a regular (non-event) subprocess carries event definitions. Per BPMN semantics, event definitions on start events are only meaningful for event subprocesses; the engine ignores them here and treats the start as a none start event. It indicates the process model is likely invalid or the author intended an event subprocess.

Source

Thrown at modules/flowable5-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/handler/StartEventParseHandler.java:137

            EventSubProcessStartEventActivityBehavior activityBehavior = bpmnParse.getActivityBehaviorFactory().createEventSubProcessStartEventActivityBehavior(startEvent, startEventActivity.getId());
            startEventActivity.setActivityBehavior(activityBehavior);

            if (!startEvent.getEventDefinitions().isEmpty()) {
                EventDefinition eventDefinition = startEvent.getEventDefinitions().get(0);

                if (eventDefinition instanceof org.flowable.bpmn.model.ErrorEventDefinition
                        || eventDefinition instanceof MessageEventDefinition
                        || eventDefinition instanceof SignalEventDefinition) {
                    bpmnParse.getBpmnParserHandlers().parseElement(bpmnParse, eventDefinition);
                } else {
                    LOGGER.warn("start event of event subprocess must be of type 'error', 'message' or 'signal' for start event {}", startEvent.getId());
                }
            }

        } else { // "regular" subprocess

            if (!startEvent.getEventDefinitions().isEmpty()) {
                LOGGER.warn("event definitions only allowed on start event if subprocess is an event subprocess {}", bpmnParse.getCurrentSubProcess().getId());
            }
            if (scope.getProperty(PROPERTYNAME_INITIAL) == null) {
                scope.setProperty(PROPERTYNAME_INITIAL, startEventActivity);
                startEventActivity.setActivityBehavior(bpmnParse.getActivityBehaviorFactory().createNoneStartEventActivityBehavior(startEvent));
            } else {
                LOGGER.warn("multiple start events not supported for subprocess {}", bpmnParse.getCurrentSubProcess().getId());
            }
        }

    }

}

View on GitHub (pinned to d6d39ce1c6)

Solutions

  1. Add triggeredByEvent="true" to the subprocess element if an event subprocess was intended.
  2. Remove the event definition from the start event if a plain subprocess was intended (start events in regular subprocesses must be none/empty).
  3. Validate the BPMN XML with the Flowable model validator before deployment to catch this earlier.

Example fix

// before
<subProcess id="sub1">
  <startEvent id="start1">
    <errorEventDefinition errorRef="myError"/>
  </startEvent>
</subProcess>
// after
<subProcess id="sub1" triggeredByEvent="true">
  <startEvent id="start1">
    <errorEventDefinition errorRef="myError"/>
  </startEvent>
</subProcess>
Defensive patterns

Strategy: validation

Validate before calling

boolean isEventDefinitionsOnRegularSubprocessStart(SubProcess sub, StartEvent start) {
  return !Boolean.TRUE.equals(sub.isTriggeredByEvent())
      && !start.getEventDefinitions().isEmpty();
}

Prevention

When it happens

Trigger: A <subProcess> without triggeredByEvent="true" contains a <startEvent> with a child event definition (e.g. timerEventDefinition, errorEventDefinition). Thrown from StartEventParseHandler.createScopeStartEvent in the else branch handling regular subprocesses during executeParse.

Common situations: Author forgot to set triggeredByEvent="true" on the subprocess while modeling an event subprocess; a designer exported the subprocess incorrectly; copy-pasting an event start event from a process level into a subprocess.

Understand the failure class

Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.

Related errors


AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11). Data as JSON: /api/errors/349b007f067543a4. Report an issue: GitHub.