This is an automated email from the ASF dual-hosted git repository.
porcelli pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-kie-optaplanner.git
The following commit(s) were added to refs/heads/main by this push:
new 8833fa4f22 Switch to using @ConfigMapping interfaces (#3177)
8833fa4f22 is described below
commit 8833fa4f22a45f38caaff1eca478e4e855cbd024
Author: Guillaume Smet <[email protected]>
AuthorDate: Tue Aug 19 20:09:29 2025 +0200
Switch to using @ConfigMapping interfaces (#3177)
Legacy @ConfigRoot classes support will be dropped soon from Quarkus and
Quarkus 3.15+ already supports @ConfigMapping interfaces so we can move
this project to the new infrastructure.
One thing that is important is that you are currently using runtime
config at static init - which means that it's build time for native
images and this is not correct - and disallowed.
I fixed it but the important consequence of this is that the solver will
be initialized at runtime, including when building native image.
This commit is still incomplete though as I end up with some class loader
issues and I didn't have the time to go further.
---
.../deployment/pom.xml | 3 --
.../OptaPlannerBenchmarkBuildTimeConfig.java | 11 ++++---
.../deployment/OptaPlannerBenchmarkProcessor.java | 9 ++---
...ProcessorMissingSpentLimitPerBenchmarkTest.java | 10 +++++-
...nerBenchmarkProcessorMissingSpentLimitTest.java | 10 +++++-
.../optaplanner-quarkus-benchmark/runtime/pom.xml | 3 --
.../quarkus/OptaPlannerBenchmarkRecorder.java | 38 +++++++++++++---------
.../config/OptaPlannerBenchmarkRuntimeConfig.java | 17 ++++++----
.../optaplanner-quarkus-jackson/deployment/pom.xml | 3 --
.../optaplanner-quarkus-jackson/runtime/pom.xml | 3 --
.../optaplanner-quarkus-jsonb/deployment/pom.xml | 3 --
.../optaplanner-quarkus-jsonb/runtime/pom.xml | 3 --
.../optaplanner-quarkus/deployment/pom.xml | 3 --
.../quarkus/deployment/OptaPlannerProcessor.java | 28 +++++++++-------
.../config/OptaPlannerBuildTimeConfig.java | 16 ++++-----
.../deployment/config/SolverBuildTimeConfig.java | 15 +++------
.../optaplanner-quarkus/runtime/pom.xml | 3 --
.../optaplanner/quarkus/OptaPlannerRecorder.java | 29 +++++++++--------
.../quarkus/config/OptaPlannerRuntimeConfig.java | 13 ++++----
.../quarkus/config/SolverManagerRuntimeConfig.java | 6 ++--
.../quarkus/config/SolverRuntimeConfig.java | 9 ++---
.../quarkus/config/TerminationRuntimeConfig.java | 14 ++++----
22 files changed, 122 insertions(+), 127 deletions(-)
diff --git
a/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/deployment/pom.xml
b/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/deployment/pom.xml
index b4d9efe999..9ec3c94eda 100644
---
a/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/deployment/pom.xml
+++
b/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/deployment/pom.xml
@@ -108,9 +108,6 @@
<version>${version.io.quarkus}</version>
</path>
</annotationProcessorPaths>
- <compilerArgs>
- <arg>-AlegacyConfigRoot=true</arg>
- </compilerArgs>
</configuration>
</plugin>
<plugin>
diff --git
a/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/deployment/src/main/java/org/optaplanner/benchmark/quarkus/deployment/OptaPlannerBenchmarkBuildTimeConfig.java
b/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/deployment/src/main/java/org/optaplanner/benchmark/quarkus/deployment/OptaPlannerBenchmarkBuildTimeConfig.java
index 1e354415aa..1f1b0fdc2e 100644
---
a/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/deployment/src/main/java/org/optaplanner/benchmark/quarkus/deployment/OptaPlannerBenchmarkBuildTimeConfig.java
+++
b/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/deployment/src/main/java/org/optaplanner/benchmark/quarkus/deployment/OptaPlannerBenchmarkBuildTimeConfig.java
@@ -21,21 +21,22 @@ package org.optaplanner.benchmark.quarkus.deployment;
import java.util.Optional;
-import io.quarkus.runtime.annotations.ConfigItem;
import io.quarkus.runtime.annotations.ConfigRoot;
+import io.smallrye.config.ConfigMapping;
/**
* During build time, this is translated into OptaPlanner's Config classes.
*/
-@ConfigRoot(name = "optaplanner.benchmark")
-public class OptaPlannerBenchmarkBuildTimeConfig {
+@ConfigRoot
+@ConfigMapping(prefix = "quarkus.optaplanner.benchmark")
+public interface OptaPlannerBenchmarkBuildTimeConfig {
public static final String DEFAULT_SOLVER_BENCHMARK_CONFIG_URL =
"solverBenchmarkConfig.xml";
+
/**
* A classpath resource to read the benchmark configuration XML.
* Defaults to {@value DEFAULT_SOLVER_BENCHMARK_CONFIG_URL}.
* If this property isn't specified, that solverBenchmarkConfig.xml is
optional.
*/
- @ConfigItem
- Optional<String> solverBenchmarkConfigXml;
+ Optional<String> solverBenchmarkConfigXml();
}
diff --git
a/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/deployment/src/main/java/org/optaplanner/benchmark/quarkus/deployment/OptaPlannerBenchmarkProcessor.java
b/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/deployment/src/main/java/org/optaplanner/benchmark/quarkus/deployment/OptaPlannerBenchmarkProcessor.java
index 784c33a9b0..30b8f6a258 100644
---
a/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/deployment/src/main/java/org/optaplanner/benchmark/quarkus/deployment/OptaPlannerBenchmarkProcessor.java
+++
b/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/deployment/src/main/java/org/optaplanner/benchmark/quarkus/deployment/OptaPlannerBenchmarkProcessor.java
@@ -52,13 +52,13 @@ class OptaPlannerBenchmarkProcessor {
@BuildStep
HotDeploymentWatchedFileBuildItem watchSolverBenchmarkConfigXml() {
- String solverBenchmarkConfigXML =
optaPlannerBenchmarkBuildTimeConfig.solverBenchmarkConfigXml
+ String solverBenchmarkConfigXML =
optaPlannerBenchmarkBuildTimeConfig.solverBenchmarkConfigXml()
.orElse(OptaPlannerBenchmarkBuildTimeConfig.DEFAULT_SOLVER_BENCHMARK_CONFIG_URL);
return new HotDeploymentWatchedFileBuildItem(solverBenchmarkConfigXML);
}
@BuildStep
- @Record(ExecutionTime.STATIC_INIT)
+ @Record(ExecutionTime.RUNTIME_INIT)
void registerAdditionalBeans(BuildProducer<AdditionalBeanBuildItem>
additionalBeans,
BuildProducer<SyntheticBeanBuildItem> syntheticBeans,
BuildProducer<UnremovableBeanBuildItem> unremovableBeans,
@@ -71,8 +71,8 @@ class OptaPlannerBenchmarkProcessor {
}
PlannerBenchmarkConfig benchmarkConfig;
ClassLoader classLoader =
Thread.currentThread().getContextClassLoader();
- if
(optaPlannerBenchmarkBuildTimeConfig.solverBenchmarkConfigXml.isPresent()) {
- String solverBenchmarkConfigXML =
optaPlannerBenchmarkBuildTimeConfig.solverBenchmarkConfigXml.get();
+ if
(optaPlannerBenchmarkBuildTimeConfig.solverBenchmarkConfigXml().isPresent()) {
+ String solverBenchmarkConfigXML =
optaPlannerBenchmarkBuildTimeConfig.solverBenchmarkConfigXml().get();
if (classLoader.getResource(solverBenchmarkConfigXML) == null) {
throw new ConfigurationException("Invalid
quarkus.optaplanner.benchmark.solver-benchmark-config-xml property ("
+ solverBenchmarkConfigXML + "): that classpath
resource does not exist.");
@@ -85,6 +85,7 @@ class OptaPlannerBenchmarkProcessor {
benchmarkConfig = null;
}
syntheticBeans.produce(SyntheticBeanBuildItem.configure(PlannerBenchmarkConfig.class)
+ .setRuntimeInit()
.supplier(recorder.benchmarkConfigSupplier(benchmarkConfig))
.done());
additionalBeans.produce(new
AdditionalBeanBuildItem(OptaPlannerBenchmarkBeanProvider.class));
diff --git
a/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/deployment/src/test/java/org/optaplanner/benchmark/quarkus/OptaPlannerBenchmarkProcessorMissingSpentLimitPerBenchmarkTest.java
b/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/deployment/src/test/java/org/optaplanner/benchmark/quarkus/OptaPlannerBenchmarkProcessorMissingSpentLimitPerBenchmarkTest.java
index a099699774..e45dfadd5d 100644
---
a/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/deployment/src/test/java/org/optaplanner/benchmark/quarkus/OptaPlannerBenchmarkProcessorMissingSpentLimitPerBenchmarkTest.java
+++
b/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/deployment/src/test/java/org/optaplanner/benchmark/quarkus/OptaPlannerBenchmarkProcessorMissingSpentLimitPerBenchmarkTest.java
@@ -21,6 +21,8 @@ package org.optaplanner.benchmark.quarkus;
import java.util.concurrent.ExecutionException;
+import jakarta.inject.Inject;
+
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.jupiter.api.Assertions;
@@ -28,10 +30,12 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.optaplanner.benchmark.config.PlannerBenchmarkConfig;
import org.optaplanner.benchmark.config.SolverBenchmarkConfig;
+import
org.optaplanner.benchmark.quarkus.config.OptaPlannerBenchmarkRuntimeConfig;
import
org.optaplanner.benchmark.quarkus.testdata.normal.constraints.TestdataQuarkusConstraintProvider;
import
org.optaplanner.benchmark.quarkus.testdata.normal.domain.TestdataQuarkusEntity;
import
org.optaplanner.benchmark.quarkus.testdata.normal.domain.TestdataQuarkusSolution;
+import io.quarkus.runtime.RuntimeValue;
import io.quarkus.test.QuarkusUnitTest;
class OptaPlannerBenchmarkProcessorMissingSpentLimitPerBenchmarkTest {
@@ -46,12 +50,16 @@ class
OptaPlannerBenchmarkProcessorMissingSpentLimitPerBenchmarkTest {
TestdataQuarkusSolution.class,
TestdataQuarkusConstraintProvider.class)
.addAsResource("solverBenchmarkConfigSpentLimitPerBenchmarkNoTermination.xml"));
+ @Inject
+ OptaPlannerBenchmarkRuntimeConfig optaPlannerBenchmarkRuntimeConfig;
+
@Test
void benchmark() throws ExecutionException, InterruptedException {
PlannerBenchmarkConfig benchmarkConfig =
PlannerBenchmarkConfig.createFromXmlResource("solverBenchmarkConfigSpentLimitPerBenchmarkNoTermination.xml");
IllegalStateException exception =
Assertions.assertThrows(IllegalStateException.class, () -> {
- new
OptaPlannerBenchmarkRecorder().benchmarkConfigSupplier(benchmarkConfig).get();
+ new OptaPlannerBenchmarkRecorder(new
RuntimeValue<>(optaPlannerBenchmarkRuntimeConfig))
+ .benchmarkConfigSupplier(benchmarkConfig).get();
});
Assertions.assertEquals(
"The following " + SolverBenchmarkConfig.class.getSimpleName()
+ " do not " +
diff --git
a/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/deployment/src/test/java/org/optaplanner/benchmark/quarkus/OptaPlannerBenchmarkProcessorMissingSpentLimitTest.java
b/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/deployment/src/test/java/org/optaplanner/benchmark/quarkus/OptaPlannerBenchmarkProcessorMissingSpentLimitTest.java
index d53643dcf6..5d4f8045eb 100644
---
a/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/deployment/src/test/java/org/optaplanner/benchmark/quarkus/OptaPlannerBenchmarkProcessorMissingSpentLimitTest.java
+++
b/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/deployment/src/test/java/org/optaplanner/benchmark/quarkus/OptaPlannerBenchmarkProcessorMissingSpentLimitTest.java
@@ -21,16 +21,20 @@ package org.optaplanner.benchmark.quarkus;
import java.util.concurrent.ExecutionException;
+import jakarta.inject.Inject;
+
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.optaplanner.benchmark.config.PlannerBenchmarkConfig;
+import
org.optaplanner.benchmark.quarkus.config.OptaPlannerBenchmarkRuntimeConfig;
import
org.optaplanner.benchmark.quarkus.testdata.normal.constraints.TestdataQuarkusConstraintProvider;
import
org.optaplanner.benchmark.quarkus.testdata.normal.domain.TestdataQuarkusEntity;
import
org.optaplanner.benchmark.quarkus.testdata.normal.domain.TestdataQuarkusSolution;
+import io.quarkus.runtime.RuntimeValue;
import io.quarkus.test.QuarkusUnitTest;
class OptaPlannerBenchmarkProcessorMissingSpentLimitTest {
@@ -42,10 +46,14 @@ class OptaPlannerBenchmarkProcessorMissingSpentLimitTest {
.addClasses(TestdataQuarkusEntity.class,
TestdataQuarkusSolution.class,
TestdataQuarkusConstraintProvider.class));
+ @Inject
+ OptaPlannerBenchmarkRuntimeConfig optaPlannerBenchmarkRuntimeConfig;
+
@Test
void benchmark() throws ExecutionException, InterruptedException {
IllegalStateException exception =
Assertions.assertThrows(IllegalStateException.class, () -> {
- new OptaPlannerBenchmarkRecorder().benchmarkConfigSupplier(new
PlannerBenchmarkConfig()).get();
+ new OptaPlannerBenchmarkRecorder(new
RuntimeValue<>(optaPlannerBenchmarkRuntimeConfig))
+ .benchmarkConfigSupplier(new
PlannerBenchmarkConfig()).get();
});
Assertions.assertEquals(
"At least one of the properties
quarkus.optaplanner.benchmark.solver.termination.spent-limit,
quarkus.optaplanner.benchmark.solver.termination.best-score-limit,
quarkus.optaplanner.benchmark.solver.termination.unimproved-spent-limit is
required if termination is not configured in the inherited solver benchmark
config and solverBenchmarkBluePrint is used.",
diff --git
a/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/runtime/pom.xml
b/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/runtime/pom.xml
index 6ea95c3f30..2dcbb2d5a5 100644
---
a/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/runtime/pom.xml
+++
b/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/runtime/pom.xml
@@ -96,9 +96,6 @@
<version>${version.io.quarkus}</version>
</path>
</annotationProcessorPaths>
- <compilerArgs>
- <arg>-AlegacyConfigRoot=true</arg>
- </compilerArgs>
</configuration>
</plugin>
<plugin>
diff --git
a/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/runtime/src/main/java/org/optaplanner/benchmark/quarkus/OptaPlannerBenchmarkRecorder.java
b/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/runtime/src/main/java/org/optaplanner/benchmark/quarkus/OptaPlannerBenchmarkRecorder.java
index a20c73454b..44b4b2ad91 100644
---
a/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/runtime/src/main/java/org/optaplanner/benchmark/quarkus/OptaPlannerBenchmarkRecorder.java
+++
b/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/runtime/src/main/java/org/optaplanner/benchmark/quarkus/OptaPlannerBenchmarkRecorder.java
@@ -38,21 +38,29 @@ import org.optaplanner.core.config.solver.SolverConfig;
import org.optaplanner.core.config.solver.termination.TerminationConfig;
import io.quarkus.arc.Arc;
+import io.quarkus.runtime.RuntimeValue;
import io.quarkus.runtime.annotations.Recorder;
@Recorder
public class OptaPlannerBenchmarkRecorder {
+
+ private final RuntimeValue<OptaPlannerBenchmarkRuntimeConfig>
optaplannerBenchmarkRuntimeConfig;
+
+ public
OptaPlannerBenchmarkRecorder(RuntimeValue<OptaPlannerBenchmarkRuntimeConfig>
optaplannerBenchmarkRuntimeConfig) {
+ this.optaplannerBenchmarkRuntimeConfig =
optaplannerBenchmarkRuntimeConfig;
+ }
+
public Supplier<PlannerBenchmarkConfig>
benchmarkConfigSupplier(PlannerBenchmarkConfig benchmarkConfig) {
return () -> {
- OptaPlannerBenchmarkRuntimeConfig optaPlannerRuntimeConfig =
-
Arc.container().instance(OptaPlannerBenchmarkRuntimeConfig.class).get();
SolverConfig solverConfig =
Arc.container().instance(SolverConfig.class).get();
- return updateBenchmarkConfigWithRuntimeProperties(benchmarkConfig,
optaPlannerRuntimeConfig, solverConfig);
+ return updateBenchmarkConfigWithRuntimeProperties(benchmarkConfig,
optaplannerBenchmarkRuntimeConfig.getValue(),
+ solverConfig);
};
}
- private PlannerBenchmarkConfig
updateBenchmarkConfigWithRuntimeProperties(PlannerBenchmarkConfig
plannerBenchmarkConfig,
+ private static PlannerBenchmarkConfig
updateBenchmarkConfigWithRuntimeProperties(
+ PlannerBenchmarkConfig plannerBenchmarkConfig,
OptaPlannerBenchmarkRuntimeConfig benchmarkRuntimeConfig,
SolverConfig solverConfig) {
if (plannerBenchmarkConfig == null) { // no benchmarkConfig.xml
provided
@@ -60,7 +68,7 @@ public class OptaPlannerBenchmarkRecorder {
plannerBenchmarkConfig =
PlannerBenchmarkConfig.createFromSolverConfig(solverConfig);
}
- plannerBenchmarkConfig.setBenchmarkDirectory(new
File(benchmarkRuntimeConfig.resultDirectory));
+ plannerBenchmarkConfig.setBenchmarkDirectory(new
File(benchmarkRuntimeConfig.resultDirectory()));
SolverBenchmarkConfig inheritedBenchmarkConfig =
plannerBenchmarkConfig.getInheritedSolverBenchmarkConfig();
if (plannerBenchmarkConfig.getSolverBenchmarkBluePrintConfigList() !=
null) {
@@ -76,10 +84,10 @@ public class OptaPlannerBenchmarkRecorder {
inheritedTerminationConfig = new TerminationConfig();
inheritedBenchmarkConfig.getSolverConfig().setTerminationConfig(inheritedTerminationConfig);
}
-
benchmarkRuntimeConfig.termination.spentLimit.ifPresent(inheritedTerminationConfig::setSpentLimit);
- benchmarkRuntimeConfig.termination.unimprovedSpentLimit
+
benchmarkRuntimeConfig.termination().spentLimit().ifPresent(inheritedTerminationConfig::setSpentLimit);
+ benchmarkRuntimeConfig.termination().unimprovedSpentLimit()
.ifPresent(inheritedTerminationConfig::setUnimprovedSpentLimit);
-
benchmarkRuntimeConfig.termination.bestScoreLimit.ifPresent(inheritedTerminationConfig::setBestScoreLimit);
+
benchmarkRuntimeConfig.termination().bestScoreLimit().ifPresent(inheritedTerminationConfig::setBestScoreLimit);
}
TerminationConfig inheritedTerminationConfig = null;
@@ -112,10 +120,10 @@ public class OptaPlannerBenchmarkRecorder {
continue;
}
-
benchmarkRuntimeConfig.termination.spentLimit.ifPresent(terminationConfig::setSpentLimit);
- benchmarkRuntimeConfig.termination.unimprovedSpentLimit
+
benchmarkRuntimeConfig.termination().spentLimit().ifPresent(terminationConfig::setSpentLimit);
+ benchmarkRuntimeConfig.termination().unimprovedSpentLimit()
.ifPresent(terminationConfig::setUnimprovedSpentLimit);
-
benchmarkRuntimeConfig.termination.bestScoreLimit.ifPresent(terminationConfig::setBestScoreLimit);
+
benchmarkRuntimeConfig.termination().bestScoreLimit().ifPresent(terminationConfig::setBestScoreLimit);
if (!terminationConfig.isConfigured()) {
List<PhaseConfig> phaseConfigList =
solverBenchmarkConfig.getSolverConfig().getPhaseConfigList();
@@ -173,7 +181,7 @@ public class OptaPlannerBenchmarkRecorder {
return plannerBenchmarkConfig;
}
- private void inheritPropertiesFromSolverConfig(SolverBenchmarkConfig
childBenchmarkConfig,
+ private static void
inheritPropertiesFromSolverConfig(SolverBenchmarkConfig childBenchmarkConfig,
SolverBenchmarkConfig inheritedBenchmarkConfig,
SolverConfig solverConfig) {
inheritProperty(childBenchmarkConfig, inheritedBenchmarkConfig,
solverConfig,
@@ -183,7 +191,7 @@ public class OptaPlannerBenchmarkRecorder {
inheritScoreCalculation(childBenchmarkConfig,
inheritedBenchmarkConfig, solverConfig);
}
- private <T> void inheritProperty(SolverBenchmarkConfig
childBenchmarkConfig,
+ private static <T> void inheritProperty(SolverBenchmarkConfig
childBenchmarkConfig,
SolverBenchmarkConfig inheritedBenchmarkConfig,
SolverConfig solverConfig,
Function<SolverConfig, T> getter,
@@ -198,7 +206,7 @@ public class OptaPlannerBenchmarkRecorder {
setter.accept(childBenchmarkConfig.getSolverConfig(),
getter.apply(solverConfig));
}
- private void inheritScoreCalculation(SolverBenchmarkConfig
childBenchmarkConfig,
+ private static void inheritScoreCalculation(SolverBenchmarkConfig
childBenchmarkConfig,
SolverBenchmarkConfig inheritedBenchmarkConfig,
SolverConfig solverConfig) {
@@ -219,7 +227,7 @@ public class OptaPlannerBenchmarkRecorder {
childScoreDirectorFactoryConfig.inherit(inheritedScoreDirectorFactoryConfig);
}
- private boolean isScoreCalculationDefined(SolverConfig solverConfig) {
+ private static boolean isScoreCalculationDefined(SolverConfig
solverConfig) {
if (solverConfig == null) {
return false;
}
diff --git
a/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/runtime/src/main/java/org/optaplanner/benchmark/quarkus/config/OptaPlannerBenchmarkRuntimeConfig.java
b/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/runtime/src/main/java/org/optaplanner/benchmark/quarkus/config/OptaPlannerBenchmarkRuntimeConfig.java
index 32e3939b6f..8320f8e162 100644
---
a/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/runtime/src/main/java/org/optaplanner/benchmark/quarkus/config/OptaPlannerBenchmarkRuntimeConfig.java
+++
b/optaplanner-quarkus-integration/optaplanner-quarkus-benchmark/runtime/src/main/java/org/optaplanner/benchmark/quarkus/config/OptaPlannerBenchmarkRuntimeConfig.java
@@ -21,24 +21,27 @@ package org.optaplanner.benchmark.quarkus.config;
import org.optaplanner.quarkus.config.TerminationRuntimeConfig;
-import io.quarkus.runtime.annotations.ConfigItem;
import io.quarkus.runtime.annotations.ConfigPhase;
import io.quarkus.runtime.annotations.ConfigRoot;
+import io.smallrye.config.ConfigMapping;
+import io.smallrye.config.WithDefault;
+import io.smallrye.config.WithName;
-@ConfigRoot(name = "optaplanner.benchmark", phase = ConfigPhase.RUN_TIME)
-public class OptaPlannerBenchmarkRuntimeConfig {
+@ConfigRoot(phase = ConfigPhase.RUN_TIME)
+@ConfigMapping(prefix = "quarkus.optaplanner.benchmark")
+public interface OptaPlannerBenchmarkRuntimeConfig {
public static final String DEFAULT_BENCHMARK_RESULT_DIRECTORY =
"target/benchmarks";
/**
* Where the benchmark results are written to. Defaults to
* {@link DEFAULT_BENCHMARK_RESULT_DIRECTORY}.
*/
- @ConfigItem(defaultValue = DEFAULT_BENCHMARK_RESULT_DIRECTORY)
- public String resultDirectory;
+ @WithDefault(DEFAULT_BENCHMARK_RESULT_DIRECTORY)
+ String resultDirectory();
/**
* Termination configuration for the solvers run in the benchmark.
*/
- @ConfigItem(name = "solver.termination")
- public TerminationRuntimeConfig termination;
+ @WithName("solver.termination")
+ TerminationRuntimeConfig termination();
}
diff --git
a/optaplanner-quarkus-integration/optaplanner-quarkus-jackson/deployment/pom.xml
b/optaplanner-quarkus-integration/optaplanner-quarkus-jackson/deployment/pom.xml
index 3da3593b77..950f767c91 100644
---
a/optaplanner-quarkus-integration/optaplanner-quarkus-jackson/deployment/pom.xml
+++
b/optaplanner-quarkus-integration/optaplanner-quarkus-jackson/deployment/pom.xml
@@ -73,9 +73,6 @@
<version>${version.io.quarkus}</version>
</path>
</annotationProcessorPaths>
- <compilerArgs>
- <arg>-AlegacyConfigRoot=true</arg>
- </compilerArgs>
</configuration>
</plugin>
</plugins>
diff --git
a/optaplanner-quarkus-integration/optaplanner-quarkus-jackson/runtime/pom.xml
b/optaplanner-quarkus-integration/optaplanner-quarkus-jackson/runtime/pom.xml
index fcbb3ec9ab..f42a2da5be 100644
---
a/optaplanner-quarkus-integration/optaplanner-quarkus-jackson/runtime/pom.xml
+++
b/optaplanner-quarkus-integration/optaplanner-quarkus-jackson/runtime/pom.xml
@@ -91,9 +91,6 @@
<version>${version.io.quarkus}</version>
</path>
</annotationProcessorPaths>
- <compilerArgs>
- <arg>-AlegacyConfigRoot=true</arg>
- </compilerArgs>
</configuration>
</plugin>
<plugin>
diff --git
a/optaplanner-quarkus-integration/optaplanner-quarkus-jsonb/deployment/pom.xml
b/optaplanner-quarkus-integration/optaplanner-quarkus-jsonb/deployment/pom.xml
index eae3edb933..353abd04b7 100644
---
a/optaplanner-quarkus-integration/optaplanner-quarkus-jsonb/deployment/pom.xml
+++
b/optaplanner-quarkus-integration/optaplanner-quarkus-jsonb/deployment/pom.xml
@@ -73,9 +73,6 @@
<version>${version.io.quarkus}</version>
</path>
</annotationProcessorPaths>
- <compilerArgs>
- <arg>-AlegacyConfigRoot=true</arg>
- </compilerArgs>
</configuration>
</plugin>
</plugins>
diff --git
a/optaplanner-quarkus-integration/optaplanner-quarkus-jsonb/runtime/pom.xml
b/optaplanner-quarkus-integration/optaplanner-quarkus-jsonb/runtime/pom.xml
index eaabc990cc..e1d07f0335 100644
--- a/optaplanner-quarkus-integration/optaplanner-quarkus-jsonb/runtime/pom.xml
+++ b/optaplanner-quarkus-integration/optaplanner-quarkus-jsonb/runtime/pom.xml
@@ -92,9 +92,6 @@
<version>${version.io.quarkus}</version>
</path>
</annotationProcessorPaths>
- <compilerArgs>
- <arg>-AlegacyConfigRoot=true</arg>
- </compilerArgs>
</configuration>
</plugin>
</plugins>
diff --git
a/optaplanner-quarkus-integration/optaplanner-quarkus/deployment/pom.xml
b/optaplanner-quarkus-integration/optaplanner-quarkus/deployment/pom.xml
index 7be68161a0..139cd6f880 100644
--- a/optaplanner-quarkus-integration/optaplanner-quarkus/deployment/pom.xml
+++ b/optaplanner-quarkus-integration/optaplanner-quarkus/deployment/pom.xml
@@ -106,9 +106,6 @@
<version>${version.io.quarkus}</version>
</path>
</annotationProcessorPaths>
- <compilerArgs>
- <arg>-AlegacyConfigRoot=true</arg>
- </compilerArgs>
</configuration>
</plugin>
<plugin>
diff --git
a/optaplanner-quarkus-integration/optaplanner-quarkus/deployment/src/main/java/org/optaplanner/quarkus/deployment/OptaPlannerProcessor.java
b/optaplanner-quarkus-integration/optaplanner-quarkus/deployment/src/main/java/org/optaplanner/quarkus/deployment/OptaPlannerProcessor.java
index c31adfd5e1..eb597ebcbe 100644
---
a/optaplanner-quarkus-integration/optaplanner-quarkus/deployment/src/main/java/org/optaplanner/quarkus/deployment/OptaPlannerProcessor.java
+++
b/optaplanner-quarkus-integration/optaplanner-quarkus/deployment/src/main/java/org/optaplanner/quarkus/deployment/OptaPlannerProcessor.java
@@ -19,6 +19,7 @@
package org.optaplanner.quarkus.deployment;
+import static io.quarkus.deployment.annotations.ExecutionTime.RUNTIME_INIT;
import static io.quarkus.deployment.annotations.ExecutionTime.STATIC_INIT;
import java.io.IOException;
@@ -137,7 +138,7 @@ class OptaPlannerProcessor {
@BuildStep
HotDeploymentWatchedFileBuildItem watchSolverConfigXml() {
- String solverConfigXML = optaPlannerBuildTimeConfig.solverConfigXml
+ String solverConfigXML = optaPlannerBuildTimeConfig.solverConfigXml()
.orElse(OptaPlannerBuildTimeConfig.DEFAULT_SOLVER_CONFIG_URL);
return new HotDeploymentWatchedFileBuildItem(solverConfigXML);
}
@@ -145,7 +146,7 @@ class OptaPlannerProcessor {
@BuildStep
HotDeploymentWatchedFileBuildItem watchConstraintsDrl() {
String constraintsDrl =
-
optaPlannerBuildTimeConfig.scoreDrl.orElse(OptaPlannerBuildTimeConfig.DEFAULT_CONSTRAINTS_DRL_URL);
+
optaPlannerBuildTimeConfig.scoreDrl().orElse(OptaPlannerBuildTimeConfig.DEFAULT_CONSTRAINTS_DRL_URL);
return new HotDeploymentWatchedFileBuildItem(constraintsDrl);
}
@@ -225,9 +226,10 @@ class OptaPlannerProcessor {
}
@BuildStep
- @Record(STATIC_INIT)
+ @Record(RUNTIME_INIT)
SolverConfigBuildItem recordAndRegisterBeans(OptaPlannerRecorder recorder,
RecorderContext recorderContext,
DetermineIfNativeBuildItem determineIfNative,
CombinedIndexBuildItem combinedIndex,
+ OptaPlannerRuntimeConfig optaplannerRuntimeConfig,
BuildProducer<ReflectiveHierarchyBuildItem>
reflectiveHierarchyClass,
BuildProducer<SyntheticBeanBuildItem>
syntheticBeanBuildItemBuildProducer,
BuildProducer<AdditionalBeanBuildItem> additionalBeans,
@@ -254,8 +256,8 @@ class OptaPlannerProcessor {
// Internally, OptaPlanner defaults the ClassLoader to
getContextClassLoader() too
ClassLoader classLoader =
Thread.currentThread().getContextClassLoader();
SolverConfig solverConfig;
- if (optaPlannerBuildTimeConfig.solverConfigXml.isPresent()) {
- String solverConfigXML =
optaPlannerBuildTimeConfig.solverConfigXml.get();
+ if (optaPlannerBuildTimeConfig.solverConfigXml().isPresent()) {
+ String solverConfigXML =
optaPlannerBuildTimeConfig.solverConfigXml().get();
if (classLoader.getResource(solverConfigXML) == null) {
throw new ConfigurationException("Invalid
quarkus.optaplanner.solverConfigXML property ("
+ solverConfigXML + "): that classpath resource does
not exist.");
@@ -313,6 +315,7 @@ class OptaPlannerProcessor {
syntheticBeanBuildItemBuildProducer.produce(SyntheticBeanBuildItem.configure(SolverConfig.class)
.scope(Singleton.class)
.defaultBean()
+ .setRuntimeInit()
.supplier(recorder.solverConfigSupplier(solverConfig,
GizmoMemberAccessorEntityEnhancer.getGeneratedGizmoMemberAccessorMap(recorderContext,
generatedGizmoClasses.generatedGizmoMemberAccessorClassSet),
@@ -323,6 +326,7 @@ class OptaPlannerProcessor {
syntheticBeanBuildItemBuildProducer.produce(SyntheticBeanBuildItem.configure(SolverManagerConfig.class)
.scope(Singleton.class)
.defaultBean()
+ .setRuntimeInit()
.supplier(recorder.solverManagerConfig(solverManagerConfig)).done());
additionalBeans.produce(new
AdditionalBeanBuildItem(DefaultOptaPlannerBeanProvider.class));
@@ -419,10 +423,10 @@ class OptaPlannerProcessor {
solverConfig.setEntityClassList(findEntityClassList(indexView));
}
applyScoreDirectorFactoryProperties(indexView, solverConfig);
-
optaPlannerBuildTimeConfig.solver.environmentMode.ifPresent(solverConfig::setEnvironmentMode);
-
optaPlannerBuildTimeConfig.solver.daemon.ifPresent(solverConfig::setDaemon);
-
optaPlannerBuildTimeConfig.solver.domainAccessType.ifPresent(solverConfig::setDomainAccessType);
-
optaPlannerBuildTimeConfig.solver.constraintStreamImplType.ifPresent(solverConfig::withConstraintStreamImplType);
+
optaPlannerBuildTimeConfig.solver().environmentMode().ifPresent(solverConfig::setEnvironmentMode);
+
optaPlannerBuildTimeConfig.solver().daemon().ifPresent(solverConfig::setDaemon);
+
optaPlannerBuildTimeConfig.solver().domainAccessType().ifPresent(solverConfig::setDomainAccessType);
+
optaPlannerBuildTimeConfig.solver().constraintStreamImplType().ifPresent(solverConfig::withConstraintStreamImplType);
if (solverConfig.getDomainAccessType() == null) {
solverConfig.setDomainAccessType(DomainAccessType.GIZMO);
@@ -579,15 +583,15 @@ class OptaPlannerProcessor {
}
protected Optional<String> constraintsDrl() {
- if (optaPlannerBuildTimeConfig.scoreDrl.isPresent()) {
- String constraintsDrl = optaPlannerBuildTimeConfig.scoreDrl.get();
+ if (optaPlannerBuildTimeConfig.scoreDrl().isPresent()) {
+ String constraintsDrl =
optaPlannerBuildTimeConfig.scoreDrl().get();
ClassLoader classLoader =
Thread.currentThread().getContextClassLoader();
if (classLoader.getResource(constraintsDrl) == null) {
throw new IllegalStateException("Invalid " +
OptaPlannerBuildTimeConfig.CONSTRAINTS_DRL_PROPERTY
+ " property (" + constraintsDrl + "): that classpath
resource does not exist.");
}
}
- return optaPlannerBuildTimeConfig.scoreDrl;
+ return optaPlannerBuildTimeConfig.scoreDrl();
}
protected Optional<String> defaultConstraintsDrl() {
diff --git
a/optaplanner-quarkus-integration/optaplanner-quarkus/deployment/src/main/java/org/optaplanner/quarkus/deployment/config/OptaPlannerBuildTimeConfig.java
b/optaplanner-quarkus-integration/optaplanner-quarkus/deployment/src/main/java/org/optaplanner/quarkus/deployment/config/OptaPlannerBuildTimeConfig.java
index e54d41ebe8..bcc0c0d562 100644
---
a/optaplanner-quarkus-integration/optaplanner-quarkus/deployment/src/main/java/org/optaplanner/quarkus/deployment/config/OptaPlannerBuildTimeConfig.java
+++
b/optaplanner-quarkus-integration/optaplanner-quarkus/deployment/src/main/java/org/optaplanner/quarkus/deployment/config/OptaPlannerBuildTimeConfig.java
@@ -26,14 +26,15 @@ import
org.optaplanner.core.api.score.calculator.IncrementalScoreCalculator;
import org.optaplanner.core.api.score.stream.ConstraintProvider;
import org.optaplanner.core.config.solver.SolverConfig;
-import io.quarkus.runtime.annotations.ConfigItem;
import io.quarkus.runtime.annotations.ConfigRoot;
+import io.smallrye.config.ConfigMapping;
/**
* During build time, this is translated into OptaPlanner's Config classes.
*/
-@ConfigRoot(name = "optaplanner")
-public class OptaPlannerBuildTimeConfig {
+@ConfigRoot
+@ConfigMapping(prefix = "quarkus.optaplanner")
+public interface OptaPlannerBuildTimeConfig {
public static final String DEFAULT_SOLVER_CONFIG_URL = "solverConfig.xml";
public static final String DEFAULT_CONSTRAINTS_DRL_URL = "constraints.drl";
@@ -44,8 +45,7 @@ public class OptaPlannerBuildTimeConfig {
* Defaults to {@value DEFAULT_SOLVER_CONFIG_URL}.
* If this property isn't specified, that solverConfig.xml is optional.
*/
- @ConfigItem
- public Optional<String> solverConfigXml;
+ Optional<String> solverConfigXml();
/**
* A classpath resource to read the solver score DRL.
@@ -53,13 +53,11 @@ public class OptaPlannerBuildTimeConfig {
* Do not define this property when a {@link ConstraintProvider}, {@link
EasyScoreCalculator} or
* {@link IncrementalScoreCalculator} class exists.
*/
- @ConfigItem
- public Optional<String> scoreDrl;
+ Optional<String> scoreDrl();
/**
* Configuration properties that overwrite OptaPlanner's {@link
SolverConfig}.
*/
- @ConfigItem
- public SolverBuildTimeConfig solver;
+ SolverBuildTimeConfig solver();
}
diff --git
a/optaplanner-quarkus-integration/optaplanner-quarkus/deployment/src/main/java/org/optaplanner/quarkus/deployment/config/SolverBuildTimeConfig.java
b/optaplanner-quarkus-integration/optaplanner-quarkus/deployment/src/main/java/org/optaplanner/quarkus/deployment/config/SolverBuildTimeConfig.java
index 7597dcfc8f..c2681020d8 100644
---
a/optaplanner-quarkus-integration/optaplanner-quarkus/deployment/src/main/java/org/optaplanner/quarkus/deployment/config/SolverBuildTimeConfig.java
+++
b/optaplanner-quarkus-integration/optaplanner-quarkus/deployment/src/main/java/org/optaplanner/quarkus/deployment/config/SolverBuildTimeConfig.java
@@ -28,7 +28,6 @@ import org.optaplanner.core.config.solver.SolverConfig;
import org.optaplanner.quarkus.config.SolverRuntimeConfig;
import io.quarkus.runtime.annotations.ConfigGroup;
-import io.quarkus.runtime.annotations.ConfigItem;
/**
* During build time, this is translated into OptaPlanner's {@link
SolverConfig}
@@ -37,34 +36,30 @@ import io.quarkus.runtime.annotations.ConfigItem;
* See also {@link SolverRuntimeConfig}
*/
@ConfigGroup
-public class SolverBuildTimeConfig {
+public interface SolverBuildTimeConfig {
/**
* Enable runtime assertions to detect common bugs in your implementation
during development.
* Defaults to {@link EnvironmentMode#REPRODUCIBLE}.
*/
- @ConfigItem
- public Optional<EnvironmentMode> environmentMode;
+ Optional<EnvironmentMode> environmentMode();
/**
* Enable daemon mode. In daemon mode, non-early termination pauses the
solver instead of stopping it,
* until the next problem fact change arrives. This is often useful for
real-time planning.
* Defaults to "false".
*/
- @ConfigItem
- public Optional<Boolean> daemon;
+ Optional<Boolean> daemon();
/**
* Determines how to access the fields and methods of domain classes.
* Defaults to {@link DomainAccessType#GIZMO}.
*/
- @ConfigItem
- public Optional<DomainAccessType> domainAccessType;
+ Optional<DomainAccessType> domainAccessType();
/**
* What constraint stream implementation to use. Defaults to {@link
ConstraintStreamImplType#DROOLS}.
*/
- @ConfigItem
- public Optional<ConstraintStreamImplType> constraintStreamImplType;
+ Optional<ConstraintStreamImplType> constraintStreamImplType();
}
diff --git
a/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/pom.xml
b/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/pom.xml
index 4f70512453..e3420bf10b 100644
--- a/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/pom.xml
+++ b/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/pom.xml
@@ -104,9 +104,6 @@
<version>${version.io.quarkus}</version>
</path>
</annotationProcessorPaths>
- <compilerArgs>
- <arg>-AlegacyConfigRoot=true</arg>
- </compilerArgs>
</configuration>
</plugin>
<plugin>
diff --git
a/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/src/main/java/org/optaplanner/quarkus/OptaPlannerRecorder.java
b/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/src/main/java/org/optaplanner/quarkus/OptaPlannerRecorder.java
index 07f1a9fd32..e879932408 100644
---
a/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/src/main/java/org/optaplanner/quarkus/OptaPlannerRecorder.java
+++
b/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/src/main/java/org/optaplanner/quarkus/OptaPlannerRecorder.java
@@ -30,20 +30,23 @@ import
org.optaplanner.core.config.solver.termination.TerminationConfig;
import org.optaplanner.core.impl.domain.common.accessor.MemberAccessor;
import org.optaplanner.quarkus.config.OptaPlannerRuntimeConfig;
-import io.quarkus.arc.Arc;
import io.quarkus.runtime.RuntimeValue;
import io.quarkus.runtime.annotations.Recorder;
@Recorder
public class OptaPlannerRecorder {
+ private final RuntimeValue<OptaPlannerRuntimeConfig>
optaPlannerRuntimeConfig;
+
+ public OptaPlannerRecorder(RuntimeValue<OptaPlannerRuntimeConfig>
optaPlannerRuntimeConfig) {
+ this.optaPlannerRuntimeConfig = optaPlannerRuntimeConfig;
+ }
+
public Supplier<SolverConfig> solverConfigSupplier(final SolverConfig
solverConfig,
Map<String, RuntimeValue<MemberAccessor>>
generatedGizmoMemberAccessorMap,
Map<String, RuntimeValue<SolutionCloner>>
generatedGizmoSolutionClonerMap) {
return () -> {
- OptaPlannerRuntimeConfig optaPlannerRuntimeConfig =
-
Arc.container().instance(OptaPlannerRuntimeConfig.class).get();
- updateSolverConfigWithRuntimeProperties(solverConfig,
optaPlannerRuntimeConfig);
+ updateSolverConfigWithRuntimeProperties(solverConfig,
optaPlannerRuntimeConfig.getValue());
Map<String, MemberAccessor> memberAccessorMap = new HashMap<>();
Map<String, SolutionCloner> solutionClonerMap = new HashMap<>();
generatedGizmoMemberAccessorMap
@@ -59,30 +62,28 @@ public class OptaPlannerRecorder {
public Supplier<SolverManagerConfig> solverManagerConfig(final
SolverManagerConfig solverManagerConfig) {
return () -> {
- OptaPlannerRuntimeConfig optaPlannerRuntimeConfig =
-
Arc.container().instance(OptaPlannerRuntimeConfig.class).get();
-
updateSolverManagerConfigWithRuntimeProperties(solverManagerConfig,
optaPlannerRuntimeConfig);
+
updateSolverManagerConfigWithRuntimeProperties(solverManagerConfig,
optaPlannerRuntimeConfig.getValue());
return solverManagerConfig;
};
}
- private void updateSolverConfigWithRuntimeProperties(SolverConfig
solverConfig,
+ private static void updateSolverConfigWithRuntimeProperties(SolverConfig
solverConfig,
OptaPlannerRuntimeConfig optaPlannerRunTimeConfig) {
TerminationConfig terminationConfig =
solverConfig.getTerminationConfig();
if (terminationConfig == null) {
terminationConfig = new TerminationConfig();
solverConfig.setTerminationConfig(terminationConfig);
}
-
optaPlannerRunTimeConfig.solver.termination.spentLimit.ifPresent(terminationConfig::setSpentLimit);
- optaPlannerRunTimeConfig.solver.termination.unimprovedSpentLimit
+
optaPlannerRunTimeConfig.solver().termination().spentLimit().ifPresent(terminationConfig::setSpentLimit);
+ optaPlannerRunTimeConfig.solver().termination().unimprovedSpentLimit()
.ifPresent(terminationConfig::setUnimprovedSpentLimit);
-
optaPlannerRunTimeConfig.solver.termination.bestScoreLimit.ifPresent(terminationConfig::setBestScoreLimit);
-
optaPlannerRunTimeConfig.solver.moveThreadCount.ifPresent(solverConfig::setMoveThreadCount);
+
optaPlannerRunTimeConfig.solver().termination().bestScoreLimit().ifPresent(terminationConfig::setBestScoreLimit);
+
optaPlannerRunTimeConfig.solver().moveThreadCount().ifPresent(solverConfig::setMoveThreadCount);
}
- private void
updateSolverManagerConfigWithRuntimeProperties(SolverManagerConfig
solverManagerConfig,
+ private static void
updateSolverManagerConfigWithRuntimeProperties(SolverManagerConfig
solverManagerConfig,
OptaPlannerRuntimeConfig optaPlannerRunTimeConfig) {
-
optaPlannerRunTimeConfig.solverManager.parallelSolverCount.ifPresent(solverManagerConfig::setParallelSolverCount);
+
optaPlannerRunTimeConfig.solverManager().parallelSolverCount().ifPresent(solverManagerConfig::setParallelSolverCount);
}
}
diff --git
a/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/src/main/java/org/optaplanner/quarkus/config/OptaPlannerRuntimeConfig.java
b/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/src/main/java/org/optaplanner/quarkus/config/OptaPlannerRuntimeConfig.java
index 515e1e4b1c..fc3b8a8cb5 100644
---
a/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/src/main/java/org/optaplanner/quarkus/config/OptaPlannerRuntimeConfig.java
+++
b/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/src/main/java/org/optaplanner/quarkus/config/OptaPlannerRuntimeConfig.java
@@ -22,22 +22,21 @@ package org.optaplanner.quarkus.config;
import org.optaplanner.core.config.solver.SolverConfig;
import org.optaplanner.core.config.solver.SolverManagerConfig;
-import io.quarkus.runtime.annotations.ConfigItem;
import io.quarkus.runtime.annotations.ConfigPhase;
import io.quarkus.runtime.annotations.ConfigRoot;
+import io.smallrye.config.ConfigMapping;
-@ConfigRoot(name = "optaplanner", phase = ConfigPhase.RUN_TIME)
-public class OptaPlannerRuntimeConfig {
+@ConfigRoot(phase = ConfigPhase.RUN_TIME)
+@ConfigMapping(prefix = "quarkus.optaplanner")
+public interface OptaPlannerRuntimeConfig {
/**
* During run time, this is translated into OptaPlanner's {@link
SolverConfig}
* runtime properties.
*/
- @ConfigItem
- public SolverRuntimeConfig solver;
+ SolverRuntimeConfig solver();
/**
* Configuration properties that overwrite OptaPlanner's {@link
SolverManagerConfig}.
*/
- @ConfigItem
- public SolverManagerRuntimeConfig solverManager;
+ SolverManagerRuntimeConfig solverManager();
}
diff --git
a/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/src/main/java/org/optaplanner/quarkus/config/SolverManagerRuntimeConfig.java
b/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/src/main/java/org/optaplanner/quarkus/config/SolverManagerRuntimeConfig.java
index eef875cf74..ec99d472c7 100644
---
a/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/src/main/java/org/optaplanner/quarkus/config/SolverManagerRuntimeConfig.java
+++
b/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/src/main/java/org/optaplanner/quarkus/config/SolverManagerRuntimeConfig.java
@@ -24,20 +24,18 @@ import java.util.Optional;
import org.optaplanner.core.config.solver.SolverManagerConfig;
import io.quarkus.runtime.annotations.ConfigGroup;
-import io.quarkus.runtime.annotations.ConfigItem;
/**
* During build time, this is translated into OptaPlanner's {@link
SolverManagerConfig}.
*/
@ConfigGroup
-public class SolverManagerRuntimeConfig {
+public interface SolverManagerRuntimeConfig {
/**
* The number of solvers that run in parallel. This directly influences
CPU consumption.
* Defaults to {@value SolverManagerConfig#PARALLEL_SOLVER_COUNT_AUTO}.
* Other options include a number or formula based on the available
processor count.
*/
- @ConfigItem
- public Optional<String> parallelSolverCount;
+ public Optional<String> parallelSolverCount();
}
diff --git
a/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/src/main/java/org/optaplanner/quarkus/config/SolverRuntimeConfig.java
b/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/src/main/java/org/optaplanner/quarkus/config/SolverRuntimeConfig.java
index 64c7372299..e08ef4c65e 100644
---
a/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/src/main/java/org/optaplanner/quarkus/config/SolverRuntimeConfig.java
+++
b/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/src/main/java/org/optaplanner/quarkus/config/SolverRuntimeConfig.java
@@ -25,26 +25,23 @@ import org.optaplanner.core.config.solver.SolverConfig;
import org.optaplanner.core.config.solver.termination.TerminationConfig;
import io.quarkus.runtime.annotations.ConfigGroup;
-import io.quarkus.runtime.annotations.ConfigItem;
/**
* During run time, this overrides some of OptaPlanner's {@link SolverConfig}
* properties.
*/
@ConfigGroup
-public class SolverRuntimeConfig {
+public interface SolverRuntimeConfig {
/**
* Enable multithreaded solving for a single problem, which increases CPU
consumption.
* Defaults to {@value SolverConfig#MOVE_THREAD_COUNT_NONE}.
* Other options include {@value SolverConfig#MOVE_THREAD_COUNT_AUTO}, a
number
* or formula based on the available processor count.
*/
- @ConfigItem
- public Optional<String> moveThreadCount;
+ public Optional<String> moveThreadCount();
/**
* Configuration properties that overwrite OptaPlanner's {@link
TerminationConfig}.
*/
- @ConfigItem
- public TerminationRuntimeConfig termination;
+ public TerminationRuntimeConfig termination();
}
diff --git
a/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/src/main/java/org/optaplanner/quarkus/config/TerminationRuntimeConfig.java
b/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/src/main/java/org/optaplanner/quarkus/config/TerminationRuntimeConfig.java
index 87f12d204e..12b09dcae3 100644
---
a/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/src/main/java/org/optaplanner/quarkus/config/TerminationRuntimeConfig.java
+++
b/optaplanner-quarkus-integration/optaplanner-quarkus/runtime/src/main/java/org/optaplanner/quarkus/config/TerminationRuntimeConfig.java
@@ -25,35 +25,33 @@ import java.util.Optional;
import org.optaplanner.core.config.solver.termination.TerminationConfig;
import io.quarkus.runtime.annotations.ConfigGroup;
-import io.quarkus.runtime.annotations.ConfigItem;
/**
* During build time, this is translated into OptaPlanner's {@link
TerminationConfig}.
*/
@ConfigGroup
-public class TerminationRuntimeConfig {
+public interface TerminationRuntimeConfig {
/**
* How long the solver can run.
* For example: "30s" is 30 seconds. "5m" is 5 minutes. "2h" is 2 hours.
"1d" is 1 day.
* Also supports ISO-8601 format, see {@link Duration}.
*/
- @ConfigItem
- public Optional<Duration> spentLimit;
+ Optional<Duration> spentLimit();
+
/**
* How long the solver can run without finding a new best solution after
finding a new best solution.
* For example: "30s" is 30 seconds. "5m" is 5 minutes. "2h" is 2 hours.
"1d" is 1 day.
* Also supports ISO-8601 format, see {@link Duration}.
*/
- @ConfigItem
- public Optional<Duration> unimprovedSpentLimit;
+ Optional<Duration> unimprovedSpentLimit();
+
/**
* Terminates the solver when a specific or higher score has been reached.
* For example: "0hard/-1000soft" terminates when the best score changes
from "0hard/-1200soft" to "0hard/-900soft".
* Wildcards are supported to replace numbers.
* For example: "0hard/*soft" to terminate when any feasible score is
reached.
*/
- @ConfigItem
- public Optional<String> bestScoreLimit;
+ Optional<String> bestScoreLimit();
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]