{"record":{"id":"046a92d2da3565e9","repo":"flowable/flowable-engine","slug":"multiple-none-start-events-or-timer-start-events-n","errorCode":null,"errorMessage":"multiple none start events or timer start events not supported on process definition","messagePattern":"multiple none start events or timer start events not supported on process definition","errorType":"exception","errorClass":"ActivitiException","httpStatus":null,"severity":"error","filePath":"modules/flowable5-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/handler/StartEventParseHandler.java","lineNumber":75,"sourceCode":"            createStartFormHandlers(bpmnParse, startEvent, (ProcessDefinitionEntity) scope);\n        } else {\n            createScopeStartEvent(bpmnParse, startEventActivity, startEvent);\n        }\n    }\n\n    protected void selectInitial(BpmnParse bpmnParse, ActivityImpl startEventActivity, StartEvent startEvent, ProcessDefinitionEntity processDefinition) {\n        if (processDefinition.getInitial() == null) {\n            processDefinition.setInitial(startEventActivity);\n        } else {\n            // validate that there is a single none start event / timer start event:\n            if (!startEventActivity.getProperty(\"type\").equals(\"messageStartEvent\")\n                    && !startEventActivity.getProperty(\"type\").equals(\"signalStartEvent\")\n                    && !startEventActivity.getProperty(\"type\").equals(\"startTimerEvent\")) {\n                String currentInitialType = (String) processDefinition.getInitial().getProperty(\"type\");\n                if (\"messageStartEvent\".equals(currentInitialType)) {\n                    processDefinition.setInitial(startEventActivity);\n                } else {\n                    throw new ActivitiException(\"multiple none start events or timer start events not supported on process definition\");\n                }\n            }\n        }\n    }\n\n    protected void createStartFormHandlers(BpmnParse bpmnParse, StartEvent startEvent, ProcessDefinitionEntity processDefinition) {\n        if (processDefinition.getInitial() != null) {\n            if (startEvent.getId().equals(processDefinition.getInitial().getId())) {\n                StartFormHandler startFormHandler = new DefaultStartFormHandler();\n                startFormHandler.parseConfiguration(startEvent.getFormProperties(), startEvent.getFormKey(), bpmnParse.getDeployment(), processDefinition);\n                processDefinition.setStartFormHandler(startFormHandler);\n            }\n        }\n    }\n\n    protected void createProcessDefinitionStartEvent(BpmnParse bpmnParse, ActivityImpl startEventActivity, StartEvent startEvent, ProcessDefinitionEntity processDefinition) {\n        if (StringUtils.isNotEmpty(startEvent.getInitiator())) {\n            processDefinition.setProperty(PROPERTYNAME_INITIATOR_VARIABLE_NAME, startEvent.getInitiator());","sourceCodeStart":57,"sourceCodeEnd":93,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable5-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/handler/StartEventParseHandler.java#L57-L93","documentation":"A process definition may have at most one initial start event of the 'none' or timer variety. During executeParse, selectInitial iterates start events and throws this ActivitiException if it encounters a second none/timer start event while the current initial is not a message start event. Multiple start events are only allowed for message/signal/timer variants per the rules encoded here.","triggerScenarios":"Deploying a BPMN process containing two or more startEvent elements where more than one is a plain none start event (or the combination resolved by this logic violates the single-initial rule), e.g. two <startEvent id=\"s1\"/><startEvent id=\"s2\"/> without message/signal/timer definitions.","commonSituations":"Merged or copy-pasted process diagrams accidentally containing duplicate start events; tooling that appends a default start event to an existing diagram; team members editing XML directly without validation.","solutions":["Remove the extra none start event so the process has exactly one initial start event","Convert additional start events to message, signal, or timer start events if parallel entry points are needed","Validate the BPMN XML in a modeler (e.g. bpmn.io validation) before deployment","Search the XML for '<startEvent' occurrences and deduplicate"],"exampleFix":"// before\n<startEvent id=\"s1\"/>\n<startEvent id=\"s2\"/>\n// after\n<startEvent id=\"s1\"/>\n<messageStartEvent id=\"s2\"><messageEventDefinition messageRef=\"m\"/></messageStartEvent>","handlingStrategy":"validation","validationCode":"long noneStarts = model.getStartEvents().stream()\n    .filter(se -> se.getEventDefinitions().isEmpty())\n    .count();\nif (noneStarts > 1) throw new IllegalStateException(\"Process must have exactly one none start event\");","typeGuard":null,"tryCatchPattern":"try {\n  repositoryService.createDeployment().addClasspathResource(processXml).deploy();\n} catch (ActivitiException e) {\n  if (e.getMessage().contains(\"multiple none start events\")) {\n    throw new InvalidProcessDefinitionException(\"Deduplicate start events in \" + processXml, e);\n  } else throw e;\n}","preventionTips":["Keep exactly one none/timer start event per process definition","Convert extra start events to message or signal start events","Run BPMN validation (bpmn.io / Activiti validate) before deployment","Review diagrams after merges for duplicated start elements"],"tags":["activiti","bpmn","process-definition"],"backgroundTag":"invalid-config-value","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-18T11:17:12.947Z"}