quarkusio/quarkus · error · ConfigurationException

Clustered jobs configured with unsupported job store option

Error message

Clustered jobs configured with unsupported job store option

What it means

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.

Source

Thrown at extensions/quartz/deployment/src/main/java/io/quarkus/quartz/deployment/QuartzProcessor.java:128

        // Add @Dependent to a Job implementation that has no scope defined but requires CDI services
        return AutoAddScopeBuildItem.builder().implementsInterface(JOB).requiresContainerServices()
                .defaultScope(BuiltinScope.DEPENDENT).build();
    }

    @BuildStep
    NativeImageProxyDefinitionBuildItem connectionProxy(QuartzBuildTimeConfig config) {
        if (config.storeType().isDbStore()) {
            return new NativeImageProxyDefinitionBuildItem(Connection.class.getName());
        }
        return null;
    }

    @BuildStep
    QuartzJDBCDriverDialectBuildItem driver(List<JdbcDataSourceBuildItem> jdbcDataSourceBuildItems,
            QuartzBuildTimeConfig config, Capabilities capabilities, CombinedIndexBuildItem indexBuildItem) {
        if (!config.storeType().isDbStore()) {
            if (config.clustered()) {
                throw new ConfigurationException("Clustered jobs configured with unsupported job store option");
            }
            // No DB storage, the driver can stay empty, and we don't need data sources either
            return new QuartzJDBCDriverDialectBuildItem(Optional.empty(), null);
        }

        if (capabilities.isMissing(Capability.AGROAL)) {
            throw new ConfigurationException(
                    "The Agroal extension is missing and it is required when a Quartz JDBC store is used.");
        }

        Optional<String> driverDelegate = config.driverDelegate();
        if (driverDelegate.isPresent()) {
            // user-specified custom delegate
            IndexView indexView = indexBuildItem.getIndex();
            ClassInfo customDelegate = indexView.getClassByName(driverDelegate.get());
            if (customDelegate == null) {
                String message = String.format(
                        "Custom JDBC delegate implementation class '%s' was not found in Jandex index. " +

View on GitHub (pinned to e1c734241f)

Solutions

  1. Set quarkus.quartz.store-type=jdbc in application.properties when quarkus.quartz.clustered=true.
  2. If you do not actually need clustering, set quarkus.quartz.clustered=false (or remove it).
  3. Check profile-specific config blocks (%prod, %test) so a test profile doesn't override store-type while clustered stays true.
  4. Ensure the datasource configuration for the JDBC store is present (Agroal datasource) since jdbc store also requires it.

Example fix

// before (application.properties)
quarkus.quartz.clustered=true
quarkus.quartz.store-type=memory

// after
quarkus.quartz.clustered=true
quarkus.quartz.store-type=jdbc
quarkus.quartz.jdbc.store-class-name=org.quarkus.example.scheduler.Db2Delegate
quarkus.datasource.db-kind=postgresql
quarkus.datasource.username=quartz
quarkus.datasource.password=secret
quarkus.datasource.jdbc.url=jdbc:postgresql://localhost:5432/quartz
Defensive patterns

Strategy: validation

Validate before calling

// Ensure clustered implies a JDBC store before enabling the Quartz extension
boolean clustered = ConfigProvider.getConfig()
    .getOptionalValue("quarkus.quartz.clustered", Boolean.class).orElse(false);
String storeType = ConfigProvider.getConfig()
    .getOptionalValue("quarkus.quartz.store-type", String.class).orElse("memory");
if (clustered && !"jdbc".equalsIgnoreCase(storeType)) {
    throw new IllegalArgumentException(
        "quarkus.quartz.clustered=true requires quarkus.quartz.store-type=jdbc");
}

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of quarkusio/quarkus@e1c734241f (2026-09-05). Data as JSON: /api/errors/cf08124e73faf0d7. Report an issue: GitHub.