flowable/flowable-engine · warning
Unsupported event definition on start event
Error message
Unsupported event definition on start event {} What it means
A process-level start event (createProcessDefinitionStartEvent path) has exactly one event definition that is not a timer, message, or signal definition — the only supported start-event kinds here. The parser logs this warning and skips parsing the definition, so the start event will not trigger for that event type.
Solutions
- Replace the start event definition with a timer, message, or signal definition
- Move the event start event into an event subprocess if error/compensation semantics are needed
- Remove the unsupported event definition from the start event
Example fix
// before <startEvent id="s1"><errorEventDefinition errorRef="e1"/></startEvent> // after <startEvent id="s1"><messageEventDefinition messageRef="m1"/></startEvent>
Defensive patterns
Strategy: validation
Validate before calling
for (StartEvent e : model.getFlowElementsOfType(StartEvent.class)) {
for (EventDefinition ed : e.getEventDefinitions()) {
if (!(ed instanceof TimerEventDefinition || ed instanceof MessageEventDefinition || ed instanceof SignalEventDefinition)) {
throw new IllegalArgumentException("Unsupported start event definition on " + e.getId());
}
}
} Type guard
function isSupportedStartDefinition(ed) { return ed != null && ['timer','message','signal'].includes(ed.type ?? guessType(ed)); } Prevention
- Use event subprocesses for error/compensation start triggers
- Restrict top-level start events to timer/message/signal definitions
- Validate imported BPMN against engine-supported feature set before deploy
When it happens
Trigger: createProcessDefinitionStartEvent (called from executeParse) on a StartEvent with one eventDefinition that is not a TimerEventDefinition, MessageEventDefinition, or SignalEventDefinition — e.g. an error, escalate, or compensate definition on a process start event.
Common situations: Importing BPMN from tools that use error/escalate start events on top-level processes; model edits moving event start events from subprocess scopes to the process scope; engine versions not yet supporting the event type.
Understand the failure class
Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.
Related errors
- Unsupported implementation type for EventListener
- Unsupported intermediate catch event type for event
- Unsupported intermediate throw event type for throw event
- Activity needed for multi instance cannot bv found
- end event with cancelEventDefinition only supported inside…
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/9789abd6a4bfa34a.
Report an issue: GitHub.
Appendix: source
Thrown at modules/flowable5-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/handler/StartEventParseHandler.java:105
}
}
}
protected void createProcessDefinitionStartEvent(BpmnParse bpmnParse, ActivityImpl startEventActivity, StartEvent startEvent, ProcessDefinitionEntity processDefinition) {
if (StringUtils.isNotEmpty(startEvent.getInitiator())) {
processDefinition.setProperty(PROPERTYNAME_INITIATOR_VARIABLE_NAME, startEvent.getInitiator());
}
// all start events share the same behavior:
startEventActivity.setActivityBehavior(bpmnParse.getActivityBehaviorFactory().createNoneStartEventActivityBehavior(startEvent));
if (!startEvent.getEventDefinitions().isEmpty()) {
EventDefinition eventDefinition = startEvent.getEventDefinitions().get(0);
if (eventDefinition instanceof TimerEventDefinition
|| eventDefinition instanceof MessageEventDefinition
|| eventDefinition instanceof SignalEventDefinition) {
bpmnParse.getBpmnParserHandlers().parseElement(bpmnParse, eventDefinition);
} else {
LOGGER.warn("Unsupported event definition on start event {}", eventDefinition);
}
}
}
protected void createScopeStartEvent(BpmnParse bpmnParse, ActivityImpl startEventActivity, StartEvent startEvent) {
ScopeImpl scope = bpmnParse.getCurrentScope();
Object triggeredByEvent = scope.getProperty("triggeredByEvent");
boolean isTriggeredByEvent = triggeredByEvent != null && ((Boolean) triggeredByEvent);
if (isTriggeredByEvent) { // event subprocess
// all start events of an event subprocess share common behavior
EventSubProcessStartEventActivityBehavior activityBehavior = bpmnParse.getActivityBehaviorFactory().createEventSubProcessStartEventActivityBehavior(startEvent, startEventActivity.getId());
startEventActivity.setActivityBehavior(activityBehavior);
if (!startEvent.getEventDefinitions().isEmpty()) {
EventDefinition eventDefinition = startEvent.getEventDefinitions().get(0);View on GitHub (pinned to d6d39ce1c6)