flowable/flowable-engine · error · FlowableException

No start element found for process definition ${processDefin

Error message

No start element found for process definition ${processDefinition.getId()}

What it means

After loading the sub-process model in CallActivityBehavior.execute, the engine asks the Process object for its initial flow element (the implicit or explicit start event). If the deployed BPMN XML has no start event at all, a call activity cannot know where to begin the sub process instance, so Flowable throws this FlowableException.

Source

Thrown at modules/flowable-engine/src/main/java/org/flowable/engine/impl/bpmn/behavior/CallActivityBehavior.java:111

        ExecutionEntity executionEntity = (ExecutionEntity) execution;
        CallActivity callActivity = (CallActivity) executionEntity.getCurrentFlowElement();
        
        CommandContext commandContext = CommandContextUtil.getCommandContext();

        ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(commandContext);

        ProcessDefinition processDefinition = getProcessDefinition(execution, callActivity, processEngineConfiguration);

        // Get model from cache
        Process subProcess = ProcessDefinitionUtil.getProcess(processDefinition.getId());
        if (subProcess == null) {
            throw new FlowableException("Cannot start a sub process instance. Process model " + processDefinition.getName() + " (id = " + processDefinition.getId() + ") could not be found");
        }

        FlowElement initialFlowElement = subProcess.getInitialFlowElement();
        if (initialFlowElement == null) {
            throw new FlowableException("No start element found for process definition " + processDefinition.getId());
        }

        // Do not start a process instance if the process definition is suspended
        if (ProcessDefinitionUtil.isProcessDefinitionSuspended(processDefinition.getId())) {
            throw new FlowableException("Cannot start process instance. Process definition " + processDefinition.getName() + " (id = " + processDefinition.getId() + ") is suspended");
        }

        ExecutionEntityManager executionEntityManager = CommandContextUtil.getExecutionEntityManager(commandContext);
        ExpressionManager expressionManager = processEngineConfiguration.getExpressionManager();

        String businessKey = null;
        if (!StringUtils.isEmpty(callActivity.getBusinessKey())) {
            Expression expression = expressionManager.createExpression(callActivity.getBusinessKey());
            businessKey = expression.getValue(execution).toString();

        } else if (callActivity.isInheritBusinessKey()) {
            ExecutionEntity processInstance = executionEntityManager.findById(execution.getProcessInstanceId());
            businessKey = processInstance.getBusinessKey();

View on GitHub (pinned to d6d39ce1c6)

Solutions

  1. Add a start event (e.g. <startEvent id="start"/>) to the sub-process BPMN XML and redeploy.
  2. Open the process in the Flowable modeler and verify it has exactly one start event connected to the first flow node.
  3. Validate the deployed model (flowable:validate) before deployment to catch start-event-less processes early.
  4. Confirm the call activity's calledElement points to the intended process, not a broken fragment deployment.

Example fix

// before: subProcess.bpmn20.xml has no start event
<process id="subProcess"><serviceTask id="task1" .../></process>
// after
<process id="subProcess"><startEvent id="start"/><sequenceFlow sourceRef="start" targetRef="task1"/><serviceTask id="task1" .../></process>
Defensive patterns

Strategy: validation

Validate before calling

boolean hasStartEvent = repositoryService.createProcessDefinitionQuery().processDefinitionKey("subProcess").latestVersion().singleResult() != null;
// plus static check: parse BPMN XML and assert a <startEvent> element exists

Try / catch

try { runtimeService.signal(executionId); }
catch (FlowableException e) { if (e.getMessage().startsWith("No start element found")) { fixModelAndRedeploy(); } else { throw e; } }

Prevention

When it happens

Trigger: Calling a sub process (via call activity calledElement) whose BPMN XML contains no start event — neither an implicit none start event nor any explicit startEvent element.

Common situations: Hand-written or generated BPMN XML missing the <startEvent> element; a model edited in an external tool that stripped the start event; copying a process fragment into a new file without a start event and deploying it.

Understand the failure class

Background: "Invalid value" and "allowed values are" config errors: what your library rejected and how to fix it — this error's family across 41 libraries.

Related errors


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