{"record":{"id":"b612807239756d3b","repo":"flowable/flowable-engine","slug":"a-datasource-is-required-for-initializing-the-engi","errorCode":null,"errorMessage":"A datasource is required for initializing the engine ","messagePattern":"A datasource is required for initializing the engine ","errorType":"validation","errorClass":"FlowableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/AbstractEngineConfigurator.java","lineNumber":286,"sourceCode":"        targetEngineConfiguration.setEventRegistryEventConsumers(engineConfiguration.getEventRegistryEventConsumers());\n    }\n\n    protected void initCommandContextFactory(AbstractEngineConfiguration engineConfiguration, AbstractEngineConfiguration targetEngineConfiguration) {\n        targetEngineConfiguration.setCommandContextFactory(engineConfiguration.getCommandContextFactory());\n    }\n\n    protected void initIdGenerator(AbstractEngineConfiguration engineConfiguration, AbstractEngineConfiguration targetEngineConfiguration) {\n        if (targetEngineConfiguration.getIdGenerator() == null) {\n            targetEngineConfiguration.setIdGenerator(engineConfiguration.getIdGenerator());\n        }\n        targetEngineConfiguration.setUsePrefixId(engineConfiguration.isUsePrefixId());\n    }\n\n    protected void initDataSource(AbstractEngineConfiguration engineConfiguration, AbstractEngineConfiguration targetEngineConfiguration) {\n        if (engineConfiguration.getDataSource() != null) {\n            targetEngineConfiguration.setDataSource(engineConfiguration.getDataSource());\n        } else {\n            throw new FlowableException(\"A datasource is required for initializing the engine \");\n        }\n    }\n\n    protected void initDbSqlSessionFactory(AbstractEngineConfiguration engineConfiguration, AbstractEngineConfiguration targetEngineConfiguration) {\n        targetEngineConfiguration.setDbSqlSessionFactory(engineConfiguration.getDbSqlSessionFactory());\n        targetEngineConfiguration.setSqlSessionFactory(engineConfiguration.getSqlSessionFactory());\n        targetEngineConfiguration.defaultInitDbSqlSessionFactoryEntitySettings(getEntityInsertionOrder(), getEntityDeletionOrder());\n    }\n\n    protected void initSessionFactories(AbstractEngineConfiguration engineConfiguration, AbstractEngineConfiguration targetEngineConfiguration) {\n        targetEngineConfiguration.setSessionFactories(engineConfiguration.getSessionFactories());\n    }\n\n    protected void initDbProperties(AbstractEngineConfiguration engineConfiguration, AbstractEngineConfiguration targetEngineConfiguration) {\n        targetEngineConfiguration.setDatabaseType(engineConfiguration.getDatabaseType());\n        targetEngineConfiguration.setDatabaseCatalog(engineConfiguration.getDatabaseCatalog());\n        targetEngineConfiguration.setDatabaseSchema(engineConfiguration.getDatabaseSchema());\n        targetEngineConfiguration.setDatabaseSchemaUpdate(engineConfiguration.getDatabaseSchemaUpdate());","sourceCodeStart":268,"sourceCodeEnd":304,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/AbstractEngineConfigurator.java#L268-L304","documentation":"When a dependent engine (e.g. process engine configured from/with another engine) is initialized via AbstractEngineConfigurator, the datasource is copied from the source engine configuration. If the source configuration has no DataSource, initialization cannot proceed and this FlowableException is thrown.","triggerScenarios":"initDataSource (called from initialiseCommonProperties during dependent-engine setup) when engineConfiguration.getDataSource() == null, i.e. the primary engine configuration was never given a DataSource (or its JNDI/JDBC fallback did not produce one).","commonSituations":"Multi-engine setups (process + cmmn/dmn/form engines) where the primary engine is configured without a datasource, or configurator ordering/initialization skipped datasource creation.","solutions":["Set a DataSource on the primary engine configuration before initializing (setDataSource or complete JDBC properties)","Ensure the primary engine's initDataSource runs successfully (fix JNDI/JDBC configuration errors first)","Check configurator registration so the shared datasource is available to dependent engines"],"exampleFix":"// before\nProcessEngineConfiguration.createStandaloneProcessEngineConfiguration().buildProcessEngine(); // no datasource\n// after\nProcessEngineConfiguration.createStandaloneProcessEngineConfiguration()\n    .setJdbcUrl(\"jdbc:h2:mem:flowable\")\n    .setJdbcDriver(\"org.h2.Driver\")\n    .setJdbcUsername(\"sa\")\n    .buildProcessEngine();","handlingStrategy":"validation","validationCode":"if (engineConfig.getDataSource() == null) { throw new IllegalStateException(\"set a DataSource before initializing engines that share configuration\"); }","typeGuard":null,"tryCatchPattern":"try { dependentEngine = buildDependentEngine(); } catch (FlowableException e) { if (e.getMessage().startsWith(\"A datasource is required\")) { /* configure datasource on primary engine and retry */ } throw e; }","preventionTips":["Configure the primary engine's DataSource before dependent engines","In multi-engine setups, verify datasource propagation in startup tests","Avoid standalone configs that bypass datasource initialization when configurators are present"],"tags":["flowable","datasource","configuration","multi-engine"],"backgroundTag":"missing-required-config-field","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}