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
- 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.
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
- 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.
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
- Quartz datasource resolution can be either deferred to runti
- Thread pool class not found: ${threadPoolClass}
- The configuration ${clazz} is missing the @ConfigRoot annota
- Invalid configuration value set for 'quarkus.arc.remove-unus
- Hibernate Envers activated explicitly for persistence unit '
AI-assisted analysis of quarkusio/quarkus@e1c734241f (2026-09-05).
Data as JSON: /api/errors/cf08124e73faf0d7.
Report an issue: GitHub.