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

  1. Replace the start event definition with a timer, message, or signal definition
  2. Move the event start event into an event subprocess if error/compensation semantics are needed
  3. 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

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


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)