{"record":{"id":"cd87dc50f6936066","repo":"flowable/flowable-engine","slug":"the-process-definition-with-id-processdefinition","errorCode":null,"errorMessage":"The process definition with id ${processDefinitionId} has more than one event-registry start events based on manually registered subscriptions, which is currently not supported.","messagePattern":"The process definition with id (.+?) has more than one event-registry start events based on manually registered subscriptions, which is currently not supported\\.","errorType":"validation","errorClass":"FlowableIllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/flowable-engine/src/main/java/org/flowable/engine/impl/cmd/RegisterProcessInstanceStartEventSubscriptionCmd.java","lineNumber":71,"sourceCode":"    @Override\n    public EventSubscription execute(CommandContext commandContext) {\n        ProcessDefinition processDefinition = getLatestProcessDefinitionByKey(builder.getProcessDefinitionKey(), builder.getTenantId(), commandContext);\n        Process process = getProcess(processDefinition.getId(), commandContext);\n\n        EventSubscription eventSubscription = null;\n        List<StartEvent> startEvents = process.findFlowElementsOfType(StartEvent.class, false);\n        for (StartEvent startEvent : startEvents) {\n            // looking for a start event based on an event-registry event subscription\n            EventRegistryEventDefinition eventDefinition = EventRegistryEventDefinitionUtil.findOn(startEvent);\n            if (eventDefinition != null && StringUtils.isNotEmpty(eventDefinition.getEventDefinitionKey())) {\n                // looking for a dynamic, manually subscribed behavior of the event-registry start event\n                List<ExtensionElement> correlationConfiguration = startEvent.getExtensionElements().get(BpmnXMLConstants.START_EVENT_CORRELATION_CONFIGURATION);\n                if (correlationConfiguration != null && correlationConfiguration.size() > 0 &&\n                    BpmnXMLConstants.START_EVENT_CORRELATION_MANUAL.equals(correlationConfiguration.get(0).getElementText())) {\n\n                    // currently, only one event-registry start event is supported for manual subscriptions\n                    if (eventSubscription != null) {\n                        throw new FlowableIllegalArgumentException(\"The process definition with id \" + processDefinition.getId()\n                            + \" has more than one event-registry start events based on manually registered subscriptions, which is currently not supported.\");\n                    }\n\n                    String eventDefinitionKey = eventDefinition.getEventDefinitionKey();\n                    String correlationKey = generateCorrelationConfiguration(eventDefinitionKey, builder.getTenantId(),\n                            builder.getCorrelationParameterValues(), commandContext);\n\n                    eventSubscription = insertEventRegistryEvent(eventDefinitionKey, builder.isDoNotUpdateToLatestVersionAutomatically(), startEvent, processDefinition,\n                        correlationKey, commandContext);\n                }\n            }\n        }\n\n        if (eventSubscription == null) {\n            throw new FlowableIllegalArgumentException(\"The process definition with id '\" + processDefinition.getId()\n                + \"' does not have an event-registry based start event with a manual subscription behavior.\");\n        }\n","sourceCodeStart":53,"sourceCodeEnd":89,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-engine/src/main/java/org/flowable/engine/impl/cmd/RegisterProcessInstanceStartEventSubscriptionCmd.java#L53-L89","documentation":"When starting a process instance via an event-registry start event with manual correlation configuration, Flowable registers a start-event subscription per process definition. The engine supports at most ONE manually registered event-registry start event per process definition; RegisterProcessInstanceStartEventSubscriptionCmd.execute throws FlowableIllegalArgumentException when it encounters a second such start event while a subscription is already registered.","triggerScenarios":"Deploying/starting a process definition whose BPMN model contains two or more event-registry start events whose <extensionElements> include flowable:startEventCorrelationConfiguration with value 'manual'; during execution of RegisterProcessInstanceStartEventSubscriptionCmd the loop finds eventSubscription already set for a second qualifying start event.","commonSituations":"Modeling multiple message/start events with manual correlation in one process definition (e.g. two different business messages that may both start the instance); copying a start event with correlation configuration to add a second trigger; upgrading Flowable and hitting a previously-tolerated model shape.","solutions":["Keep at most one manually-correlated event-registry start event per process definition; split the second trigger into a separate process definition","Change the second start event's correlation configuration from 'manual' to automatic/default correlation (remove the flowable:startEventCorrelationConfiguration extension or set it to a supported value)","Restructure the model so one start event fans out via the event registry (e.g. catch the other messages after process start with intermediate event-registry catch events)"],"exampleFix":"<!-- before: two manually-correlated start events in one definition -->\n<startEvent id=\"startA\"><extensionElements>\n  <flowable:startEventCorrelationConfiguration>manual</flowable:startEventCorrelationConfiguration>\n</extensionElements></startEvent>\n<startEvent id=\"startB\"><extensionElements>\n  <flowable:startEventCorrelationConfiguration>manual</flowable:startEventCorrelationConfiguration>\n</extensionElements></startEvent>\n<!-- after: single manual start event; other trigger modeled as intermediate catch event -->\n<startEvent id=\"startA\"><extensionElements>\n  <flowable:startEventCorrelationConfiguration>manual</flowable:startEventCorrelationConfiguration>\n</extensionElements></startEvent>\n<intermediateCatchEvent id=\"catchB\"><extensionElements>\n  <flowable:eventRegistryEventDefinition eventDefinitionKey=\"msgB\"/>\n</extensionElements></intermediateCatchEvent>","handlingStrategy":"validation","validationCode":"long manualStartEvents = model.getBpmnModel().getMainProcess().getFlowElements().stream()\n    .filter(StartEvent.class::isInstance).map(StartEvent.class::cast)\n    .filter(se -> se.getExtensionElements()\n        .getOrDefault(\"startEventCorrelationConfiguration\", Collections.emptyList())\n        .stream().anyMatch(e -> \"manual\".equals(e.getElementText())))\n    .count();\nif (manualStartEvents > 1) throw new IllegalStateException(\"At most one manual event-registry start event allowed\");","typeGuard":"boolean hasSingleManualStartEvent(BpmnModel model) {\n    long n = model.getMainProcess().getFlowElements().stream()\n        .filter(StartEvent.class::isInstance)\n        .map(StartEvent.class::cast)\n        .filter(se -> se.getExtensionElements()\n            .getOrDefault(\"startEventCorrelationConfiguration\", Collections.emptyList())\n            .stream().anyMatch(e -> \"manual\".equals(e.getElementText())))\n        .count();\n    return n <= 1;\n}","tryCatchPattern":"try {\n    runtimeService.createProcessInstanceBuilder().start();\n} catch (FlowableIllegalArgumentException e) {\n    if (e.getMessage().contains(\"more than one event-registry start events\")) {\n        // fix the BPMN model: keep one manual start event, redeploy\n    }\n    throw e;\n}","preventionTips":["Audit BPMN models at deploy time for multiple manually-correlated start events","Model additional triggers as intermediate event-registry catch events","Document the one-manual-start-event-per-definition limit for process designers"],"tags":["flowable","event-registry","bpmn-modeling","unsupported-operation","start-event"],"backgroundTag":"unsupported-operation","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}