{"record":{"id":"cf08124e73faf0d7","repo":"quarkusio/quarkus","slug":"clustered-jobs-configured-with-unsupported-job-sto","errorCode":null,"errorMessage":"Clustered jobs configured with unsupported job store option","messagePattern":"Clustered jobs configured with unsupported job store option","errorType":"exception","errorClass":"ConfigurationException","httpStatus":null,"severity":"error","filePath":"extensions/quartz/deployment/src/main/java/io/quarkus/quartz/deployment/QuartzProcessor.java","lineNumber":128,"sourceCode":"        // Add @Dependent to a Job implementation that has no scope defined but requires CDI services\n        return AutoAddScopeBuildItem.builder().implementsInterface(JOB).requiresContainerServices()\n                .defaultScope(BuiltinScope.DEPENDENT).build();\n    }\n\n    @BuildStep\n    NativeImageProxyDefinitionBuildItem connectionProxy(QuartzBuildTimeConfig config) {\n        if (config.storeType().isDbStore()) {\n            return new NativeImageProxyDefinitionBuildItem(Connection.class.getName());\n        }\n        return null;\n    }\n\n    @BuildStep\n    QuartzJDBCDriverDialectBuildItem driver(List<JdbcDataSourceBuildItem> jdbcDataSourceBuildItems,\n            QuartzBuildTimeConfig config, Capabilities capabilities, CombinedIndexBuildItem indexBuildItem) {\n        if (!config.storeType().isDbStore()) {\n            if (config.clustered()) {\n                throw new ConfigurationException(\"Clustered jobs configured with unsupported job store option\");\n            }\n            // No DB storage, the driver can stay empty, and we don't need data sources either\n            return new QuartzJDBCDriverDialectBuildItem(Optional.empty(), null);\n        }\n\n        if (capabilities.isMissing(Capability.AGROAL)) {\n            throw new ConfigurationException(\n                    \"The Agroal extension is missing and it is required when a Quartz JDBC store is used.\");\n        }\n\n        Optional<String> driverDelegate = config.driverDelegate();\n        if (driverDelegate.isPresent()) {\n            // user-specified custom delegate\n            IndexView indexView = indexBuildItem.getIndex();\n            ClassInfo customDelegate = indexView.getClassByName(driverDelegate.get());\n            if (customDelegate == null) {\n                String message = String.format(\n                        \"Custom JDBC delegate implementation class '%s' was not found in Jandex index. \" +","sourceCodeStart":110,"sourceCodeEnd":146,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/quartz/deployment/src/main/java/io/quarkus/quartz/deployment/QuartzProcessor.java#L110-L146","documentation":"A Quarkus ConfigurationException thrown by the QuartzProcessor driver build step at build time when quarkus.quartz.clustered=true but quarkus.quartz.store-type is not a DB store (e.g. is set to MEMORY or left default while not db). Quartz clustering requires the JDBC job store so nodes can share job state; clustering with any other store is unsupported, so the build fails.","triggerScenarios":"Application sets quarkus.quartz.clustered=true while quarkus.quartz.store-type is set to a non-DB value (such as memory) or resolves to one, causing config.storeType().isDbStore() to be false in the driver build step.","commonSituations":"Following a clustering tutorial but forgetting to set store-type=jdbc; explicitly setting store-type=memory while enabling clustered; a profile override that switches store-type back to memory in prod; upgrading Quarkus where the default/allowed combinations were validated more strictly.","solutions":["Set quarkus.quartz.store-type=jdbc in application.properties when quarkus.quartz.clustered=true.","If you do not actually need clustering, set quarkus.quartz.clustered=false (or remove it).","Check profile-specific config blocks (%prod, %test) so a test profile doesn't override store-type while clustered stays true.","Ensure the datasource configuration for the JDBC store is present (Agroal datasource) since jdbc store also requires it."],"exampleFix":"// before (application.properties)\nquarkus.quartz.clustered=true\nquarkus.quartz.store-type=memory\n\n// after\nquarkus.quartz.clustered=true\nquarkus.quartz.store-type=jdbc\nquarkus.quartz.jdbc.store-class-name=org.quarkus.example.scheduler.Db2Delegate\nquarkus.datasource.db-kind=postgresql\nquarkus.datasource.username=quartz\nquarkus.datasource.password=secret\nquarkus.datasource.jdbc.url=jdbc:postgresql://localhost:5432/quartz","handlingStrategy":"validation","validationCode":"// Ensure clustered implies a JDBC store before enabling the Quartz extension\nboolean clustered = ConfigProvider.getConfig()\n    .getOptionalValue(\"quarkus.quartz.clustered\", Boolean.class).orElse(false);\nString storeType = ConfigProvider.getConfig()\n    .getOptionalValue(\"quarkus.quartz.store-type\", String.class).orElse(\"memory\");\nif (clustered && !\"jdbc\".equalsIgnoreCase(storeType)) {\n    throw new IllegalArgumentException(\n        \"quarkus.quartz.clustered=true requires quarkus.quartz.store-type=jdbc\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Treat quarkus.quartz.clustered=true as always paired with quarkus.quartz.store-type=jdbc.","Check profile overrides (%prod/%test) so store-type isn't silently switched to memory where clustering is expected.","Review Quartz config after dependency or version upgrades.","Document the clustering prerequisites (JDBC store + datasource) in project setup notes."],"tags":["quarkus","quartz","build-time","configuration","clustering"],"backgroundTag":"incompatible-config-combination","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-12T22:17:10.623Z"}