diff --git a/.github/workflows/quarkus-build-native.yaml b/.github/workflows/quarkus-build-native.yaml index 15ec1f31..8543f187 100644 --- a/.github/workflows/quarkus-build-native.yaml +++ b/.github/workflows/quarkus-build-native.yaml @@ -11,21 +11,18 @@ jobs: strategy: matrix: java_version: - - '11' - # - '17' + - '17' + - '21' steps: - uses: actions/checkout@v3 - uses: graalvm/setup-graalvm@v1 with: - version: '22.3.1' java-version: ${{ matrix.java_version }} - components: 'native-image' github-token: ${{ secrets.GB_TOKEN }} - name: Build & test with native-image run: | echo "GRAALVM_HOME: $GRAALVM_HOME" echo "JAVA_HOME: $JAVA_HOME" java --version - gu --version native-image --version mvn verify -Prelease -Dnative -Dgpg.skip diff --git a/.github/workflows/quarkus-build.yaml b/.github/workflows/quarkus-build.yaml index 01019101..65cf9e32 100644 --- a/.github/workflows/quarkus-build.yaml +++ b/.github/workflows/quarkus-build.yaml @@ -7,8 +7,8 @@ jobs: strategy: matrix: java_version: - - '11' - '17' + - '21' steps: - uses: actions/checkout@v3 - uses: actions/setup-java@v3 diff --git a/deployment/src/main/java/com/datastax/oss/quarkus/deployment/api/CassandraClientBuildTimeConfig.java b/deployment/src/main/java/com/datastax/oss/quarkus/deployment/api/CassandraClientBuildTimeConfig.java index d907f5a3..b18ef226 100644 --- a/deployment/src/main/java/com/datastax/oss/quarkus/deployment/api/CassandraClientBuildTimeConfig.java +++ b/deployment/src/main/java/com/datastax/oss/quarkus/deployment/api/CassandraClientBuildTimeConfig.java @@ -18,9 +18,11 @@ import com.datastax.oss.driver.api.core.metadata.NodeStateListener; import com.datastax.oss.driver.api.core.metadata.schema.SchemaChangeListener; import com.datastax.oss.driver.api.core.tracker.RequestTracker; -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; import java.util.List; import java.util.Optional; @@ -30,14 +32,16 @@ *

Settings specified in application.properties under the {@code quarkus.cassandra} prefix will * be mapped to fields in this class and its child configuration classes. */ -@ConfigRoot(name = "cassandra", phase = ConfigPhase.BUILD_TIME) -public class CassandraClientBuildTimeConfig { +@ConfigMapping(prefix = "quarkus.cassandra") +@ConfigRoot(phase = ConfigPhase.BUILD_TIME) +public interface CassandraClientBuildTimeConfig { /** * Whether or not an health check is published in case the smallrye-health extension is present. */ - @ConfigItem(name = "health.enabled", defaultValue = "true") - public boolean healthEnabled; + @WithName("health.enabled") + @WithDefault("true") + boolean healthEnabled(); /** * Whether or not metrics for the Cassandra driver should be published. @@ -70,8 +74,9 @@ public class CassandraClientBuildTimeConfig { * href="https://docs.datastax.com/en/developer/java-driver/latest/manual/core/metrics/#configuration"> * Metrics configuration in the Java driver manual. */ - @ConfigItem(name = "metrics.enabled", defaultValue = "false") - public boolean metricsEnabled; + @WithName("metrics.enabled") + @WithDefault("false") + boolean metricsEnabled(); /** * The name of the algorithm used to compress protocol frames. @@ -87,18 +92,16 @@ public class CassandraClientBuildTimeConfig { * mode. * */ - @ConfigItem(name = "protocol.compression", defaultValue = "none") - public String protocolCompression; + @WithName("protocol.compression") + @WithDefault("none") + String protocolCompression(); /** The classes of {@link RequestTracker} implementations to register. */ - @ConfigItem(name = "request-trackers") - public Optional> requestTrackers; + Optional> requestTrackers(); /** The classes of {@link NodeStateListener} implementations to register. */ - @ConfigItem(name = "node-state-listeners") - public Optional> nodeStateListeners; + Optional> nodeStateListeners(); /** The classes of {@link SchemaChangeListener} implementations to register. */ - @ConfigItem(name = "schema-change-listeners") - public Optional> schemaChangeListeners; + Optional> schemaChangeListeners(); } diff --git a/deployment/src/main/java/com/datastax/oss/quarkus/deployment/internal/CassandraClientProcessor.java b/deployment/src/main/java/com/datastax/oss/quarkus/deployment/internal/CassandraClientProcessor.java index 5e4f0a56..786d410c 100644 --- a/deployment/src/main/java/com/datastax/oss/quarkus/deployment/internal/CassandraClientProcessor.java +++ b/deployment/src/main/java/com/datastax/oss/quarkus/deployment/internal/CassandraClientProcessor.java @@ -109,7 +109,7 @@ List registerReactiveForReflection() { @BuildStep List registerLz4ForReflection( CassandraClientBuildTimeConfig buildTimeConfig) { - if (buildTimeConfig.protocolCompression.equalsIgnoreCase("lz4")) { + if (buildTimeConfig.protocolCompression().equalsIgnoreCase("lz4")) { return Collections.singletonList( ReflectiveClassBuildItem.builder( "net.jpountz.lz4.LZ4Compressor", @@ -135,7 +135,7 @@ List registerRequestTrackersForReflection( CassandraClientRecorder recorder, BeanContainerBuildItem beanContainer) { return buildTimeConfig - .requestTrackers + .requestTrackers() .map( classes -> classes.stream() @@ -155,7 +155,7 @@ List registerNodeStateListenersForReflection( CassandraClientRecorder recorder, BeanContainerBuildItem beanContainer) { return buildTimeConfig - .nodeStateListeners + .nodeStateListeners() .map( classes -> classes.stream() @@ -175,7 +175,7 @@ List registerSchemaChangeListenersForReflection( CassandraClientRecorder recorder, BeanContainerBuildItem beanContainer) { return buildTimeConfig - .schemaChangeListeners + .schemaChangeListeners() .map( classes -> classes.stream() @@ -199,7 +199,7 @@ List registerMetricsFactoriesForReflection( CassandraClientBuildTimeConfig buildTimeConfig, Optional metricsCapability) { - if (buildTimeConfig.metricsEnabled && metricsCapability.isPresent()) { + if (buildTimeConfig.metricsEnabled() && metricsCapability.isPresent()) { Stream clzStream = Stream.empty(); MetricsCapabilityBuildItem metricsCapabilityItem = metricsCapability.get(); @@ -249,7 +249,7 @@ void configureMetrics( CassandraClientBuildTimeConfig buildTimeConfig, Optional metricsCapability, BeanContainerBuildItem beanContainer) { - if (buildTimeConfig.metricsEnabled) { + if (buildTimeConfig.metricsEnabled()) { if (metricsCapability.isPresent()) { MetricsCapabilityBuildItem metricsCapabilityItem = metricsCapability.get(); if (metricsCapabilityItem.metricsSupported(MetricsFactory.MICROMETER)) { @@ -312,7 +312,7 @@ void configureCompression( CassandraClientRecorder recorder, CassandraClientBuildTimeConfig buildTimeConfig, BeanContainerBuildItem beanContainer) { - recorder.configureCompression(buildTimeConfig.protocolCompression); + recorder.configureCompression(buildTimeConfig.protocolCompression()); } @BuildStep @@ -339,7 +339,7 @@ CassandraClientBuildItem cassandraClient( HealthBuildItem addHealthCheck(CassandraClientBuildTimeConfig buildTimeConfig) { return new HealthBuildItem( "com.datastax.oss.quarkus.runtime.internal.health.CassandraAsyncHealthCheck", - buildTimeConfig.healthEnabled); + buildTimeConfig.healthEnabled()); } /** diff --git a/deployment/src/test/java/com/datastax/oss/quarkus/deployment/internal/metrics/CassandraMetricsDisabledTest.java b/deployment/src/test/java/com/datastax/oss/quarkus/deployment/internal/metrics/CassandraMetricsDisabledTest.java index 9be1128c..6df7569f 100644 --- a/deployment/src/test/java/com/datastax/oss/quarkus/deployment/internal/metrics/CassandraMetricsDisabledTest.java +++ b/deployment/src/test/java/com/datastax/oss/quarkus/deployment/internal/metrics/CassandraMetricsDisabledTest.java @@ -24,8 +24,8 @@ import com.datastax.oss.quarkus.test.CassandraTestResource; import io.micrometer.core.instrument.Meter.Id; import io.micrometer.core.instrument.MeterRegistry; -import io.quarkus.bootstrap.model.AppArtifact; import io.quarkus.builder.Version; +import io.quarkus.maven.dependency.Dependency; import io.quarkus.test.QuarkusUnitTest; import io.quarkus.test.common.QuarkusTestResource; import jakarta.inject.Inject; @@ -53,8 +53,8 @@ public class CassandraMetricsDisabledTest { // Micrometer is present... .setForcedDependencies( Arrays.asList( - new AppArtifact("io.quarkus", "quarkus-micrometer", Version.getVersion()), - new AppArtifact("io.quarkus", "quarkus-resteasy", Version.getVersion()))) + Dependency.of("io.quarkus", "quarkus-micrometer", Version.getVersion()), + Dependency.of("io.quarkus", "quarkus-resteasy", Version.getVersion()))) // but Cassandra metrics are disabled .overrideConfigKey("quarkus.cassandra.metrics.enabled", "false"); @@ -78,6 +78,6 @@ public void should_not_enable_metrics_when_metrics_disabled_by_configuration() { } private boolean filterAllCassandraMetrics(Id id) { - return id.getName().startsWith(config.cassandraClientMetricsConfig.prefix); + return id.getName().startsWith(config.cassandraClientMetricsConfig().prefix()); } } diff --git a/deployment/src/test/java/com/datastax/oss/quarkus/deployment/internal/metrics/CassandraMetricsMicroProfileTest.java b/deployment/src/test/java/com/datastax/oss/quarkus/deployment/internal/metrics/CassandraMetricsMicroProfileTest.java index e2452986..75487271 100644 --- a/deployment/src/test/java/com/datastax/oss/quarkus/deployment/internal/metrics/CassandraMetricsMicroProfileTest.java +++ b/deployment/src/test/java/com/datastax/oss/quarkus/deployment/internal/metrics/CassandraMetricsMicroProfileTest.java @@ -21,8 +21,8 @@ import com.datastax.oss.quarkus.runtime.api.config.CassandraClientConfig; import com.datastax.oss.quarkus.runtime.api.session.QuarkusCqlSession; import com.datastax.oss.quarkus.test.CassandraTestResource; -import io.quarkus.bootstrap.model.AppArtifact; import io.quarkus.builder.Version; +import io.quarkus.maven.dependency.Dependency; import io.quarkus.test.QuarkusUnitTest; import io.quarkus.test.common.QuarkusTestResource; import jakarta.inject.Inject; @@ -58,7 +58,7 @@ public class CassandraMetricsMicroProfileTest { () -> ShrinkWrap.create(JavaArchive.class).addClasses(CassandraTestResource.class)) .setForcedDependencies( Collections.singletonList( - new AppArtifact("io.quarkus", "quarkus-smallrye-metrics", Version.getVersion()))) + Dependency.of("io.quarkus", "quarkus-smallrye-metrics", Version.getVersion()))) .overrideConfigKey("quarkus.cassandra.metrics.enabled", "true"); @Test @@ -102,6 +102,6 @@ public void should_expose_correct_number_of_metrics() { } private boolean filterAllCassandraMetrics(MetricID id) { - return id.getName().startsWith(config.cassandraClientMetricsConfig.prefix); + return id.getName().startsWith(config.cassandraClientMetricsConfig().prefix()); } } diff --git a/deployment/src/test/java/com/datastax/oss/quarkus/deployment/internal/metrics/CassandraMetricsMicrometerTest.java b/deployment/src/test/java/com/datastax/oss/quarkus/deployment/internal/metrics/CassandraMetricsMicrometerTest.java index 1034233c..5cd4fde9 100644 --- a/deployment/src/test/java/com/datastax/oss/quarkus/deployment/internal/metrics/CassandraMetricsMicrometerTest.java +++ b/deployment/src/test/java/com/datastax/oss/quarkus/deployment/internal/metrics/CassandraMetricsMicrometerTest.java @@ -26,8 +26,8 @@ import io.micrometer.core.instrument.Meter.Id; import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.Timer; -import io.quarkus.bootstrap.model.AppArtifact; import io.quarkus.builder.Version; +import io.quarkus.maven.dependency.Dependency; import io.quarkus.test.QuarkusUnitTest; import io.quarkus.test.common.QuarkusTestResource; import jakarta.inject.Inject; @@ -53,8 +53,8 @@ public class CassandraMetricsMicrometerTest { () -> ShrinkWrap.create(JavaArchive.class).addClasses(CassandraTestResource.class)) .setForcedDependencies( Arrays.asList( - new AppArtifact("io.quarkus", "quarkus-micrometer", Version.getVersion()), - new AppArtifact("io.quarkus", "quarkus-resteasy", Version.getVersion()))) + Dependency.of("io.quarkus", "quarkus-micrometer", Version.getVersion()), + Dependency.of("io.quarkus", "quarkus-resteasy", Version.getVersion()))) .overrideConfigKey("quarkus.cassandra.metrics.enabled", "true") // test a different prefix .overrideConfigKey("quarkus.cassandra.metrics.prefix", "custom.prefix"); @@ -97,7 +97,7 @@ public void should_expose_correct_number_of_metrics() { } private boolean filterAllCassandraMetrics(Id id) { - assertThat(config.cassandraClientMetricsConfig.prefix).isEqualTo("custom.prefix"); - return id.getName().startsWith(config.cassandraClientMetricsConfig.prefix); + assertThat(config.cassandraClientMetricsConfig().prefix()).isEqualTo("custom.prefix"); + return id.getName().startsWith(config.cassandraClientMetricsConfig().prefix()); } } diff --git a/integration-tests/dse/pom.xml b/integration-tests/dse/pom.xml index 43ae44ee..f8987207 100644 --- a/integration-tests/dse/pom.xml +++ b/integration-tests/dse/pom.xml @@ -141,8 +141,8 @@ - - jar + + false true diff --git a/integration-tests/pom.xml b/integration-tests/pom.xml index 85ed698b..a3f78f0a 100644 --- a/integration-tests/pom.xml +++ b/integration-tests/pom.xml @@ -116,7 +116,7 @@ - native + true true native diff --git a/pom.xml b/pom.xml index 7d50b906..574e111d 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ Note: when upgrading the Quarkus version or the DataStax Java driver version, make sure that you upgrade them in the quickstart module too. --> - 3.1.0.Final + 3.25.0 4.15.0 3.23.1 11 @@ -56,7 +56,7 @@ com.spotify.fmt fmt-maven-plugin - 2.19 + 2.27 au.com.acegi @@ -76,7 +76,7 @@ org.jacoco jacoco-maven-plugin - 0.8.8 + 0.8.13 org.apache.maven.plugins diff --git a/quickstart/pom.xml b/quickstart/pom.xml index 082de3a0..d131f12f 100644 --- a/quickstart/pom.xml +++ b/quickstart/pom.xml @@ -27,7 +27,7 @@ 2020 11 - 3.1.0.Final + 3.25.0 4.15.0 3.23.1 UTF-8 @@ -76,11 +76,11 @@ io.quarkus - quarkus-resteasy-reactive + quarkus-rest io.quarkus - quarkus-resteasy-reactive-jackson + quarkus-rest-jackson io.quarkus @@ -116,7 +116,7 @@ com.spotify.fmt fmt-maven-plugin - 2.19 + 2.27 @@ -211,7 +211,7 @@ - native + true true native diff --git a/runtime/src/main/java/com/datastax/oss/quarkus/runtime/api/config/CassandraClientAuthConfig.java b/runtime/src/main/java/com/datastax/oss/quarkus/runtime/api/config/CassandraClientAuthConfig.java index 8238b01c..89340f63 100644 --- a/runtime/src/main/java/com/datastax/oss/quarkus/runtime/api/config/CassandraClientAuthConfig.java +++ b/runtime/src/main/java/com/datastax/oss/quarkus/runtime/api/config/CassandraClientAuthConfig.java @@ -16,24 +16,21 @@ package com.datastax.oss.quarkus.runtime.api.config; import io.quarkus.runtime.annotations.ConfigGroup; -import io.quarkus.runtime.annotations.ConfigItem; import java.util.Optional; /** This class holds runtime configuration items related to authentication. */ @ConfigGroup -public class CassandraClientAuthConfig { +public interface CassandraClientAuthConfig { /** * The username used to connect to Apache Cassandra(R). If a username and a password are both * provided, plain text authentication will be automatically enabled. */ - @ConfigItem(name = "username") - public Optional username; + Optional username(); /** * The auth_provider password used to connect to Apache Cassandra(R). If a username and a password * are both provided, plain text authentication will be automatically enabled. */ - @ConfigItem(name = "password") - public Optional password; + Optional password(); } diff --git a/runtime/src/main/java/com/datastax/oss/quarkus/runtime/api/config/CassandraClientCloudConfig.java b/runtime/src/main/java/com/datastax/oss/quarkus/runtime/api/config/CassandraClientCloudConfig.java index 4e730c31..0bcc556a 100644 --- a/runtime/src/main/java/com/datastax/oss/quarkus/runtime/api/config/CassandraClientCloudConfig.java +++ b/runtime/src/main/java/com/datastax/oss/quarkus/runtime/api/config/CassandraClientCloudConfig.java @@ -16,13 +16,12 @@ package com.datastax.oss.quarkus.runtime.api.config; import io.quarkus.runtime.annotations.ConfigGroup; -import io.quarkus.runtime.annotations.ConfigItem; import java.nio.file.Path; import java.util.Optional; /** This class holds runtime configuration items related to DataStax Astra cloud clusters. */ @ConfigGroup -public class CassandraClientCloudConfig { +public interface CassandraClientCloudConfig { /** * The path to a cloud secure bundle used to connect to DataStax Astra. @@ -30,6 +29,5 @@ public class CassandraClientCloudConfig { *

This setting is not required to connect to connect to Apache Cassandra (R) or DataStax * Enterprise (DSE). */ - @ConfigItem(name = "secure-connect-bundle") - public Optional secureConnectBundle; + Optional secureConnectBundle(); } diff --git a/runtime/src/main/java/com/datastax/oss/quarkus/runtime/api/config/CassandraClientConfig.java b/runtime/src/main/java/com/datastax/oss/quarkus/runtime/api/config/CassandraClientConfig.java index ec3c4c05..d99c16e4 100644 --- a/runtime/src/main/java/com/datastax/oss/quarkus/runtime/api/config/CassandraClientConfig.java +++ b/runtime/src/main/java/com/datastax/oss/quarkus/runtime/api/config/CassandraClientConfig.java @@ -15,9 +15,11 @@ */ package com.datastax.oss.quarkus.runtime.api.config; -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.WithName; +import io.smallrye.config.WithParentName; /** * This class holds runtime configuration items for the Cassandra Quarkus extension. @@ -25,36 +27,34 @@ *

Settings specified in application.properties under the {@code quarkus.cassandra} prefix will * be mapped to fields in this class and its child configuration classes. */ -@ConfigRoot(name = CassandraClientConfig.CONFIG_NAME, phase = ConfigPhase.RUN_TIME) -public class CassandraClientConfig { - - public static final String CONFIG_NAME = "cassandra"; - +@ConfigMapping(prefix = "quarkus.cassandra") +@ConfigRoot(phase = ConfigPhase.RUN_TIME) +public interface CassandraClientConfig { /** The client connection configuration settings. */ - @ConfigItem(name = ConfigItem.PARENT) - public CassandraClientConnectionConfig cassandraClientConnectionConfig; + @WithParentName + CassandraClientConnectionConfig cassandraClientConnectionConfig(); /** The metrics settings. */ - @ConfigItem(name = "metrics") - public CassandraClientMetricsConfig cassandraClientMetricsConfig; + @WithName("metrics") + CassandraClientMetricsConfig cassandraClientMetricsConfig(); /** The cloud (DataStax Astra) configuration settings. */ - @ConfigItem(name = "cloud") - public CassandraClientCloudConfig cassandraClientCloudConfig; + @WithName("cloud") + CassandraClientCloudConfig cassandraClientCloudConfig(); /** The session initialization settings. */ - @ConfigItem(name = "init") - public CassandraClientInitConfig cassandraClientInitConfig; + @WithName("init") + CassandraClientInitConfig cassandraClientInitConfig(); /** The authentication settings. */ - @ConfigItem(name = "auth") - public CassandraClientAuthConfig cassandraClientAuthConfig; + @WithName("auth") + CassandraClientAuthConfig cassandraClientAuthConfig(); /** The request settings. */ - @ConfigItem(name = "request") - public CassandraClientRequestConfig cassandraClientRequestConfig; + @WithName("request") + CassandraClientRequestConfig cassandraClientRequestConfig(); /** The DSE Graph settings. */ - @ConfigItem(name = "graph") - public CassandraClientGraphConfig cassandraClientGraphConfig; + @WithName("graph") + CassandraClientGraphConfig cassandraClientGraphConfig(); } diff --git a/runtime/src/main/java/com/datastax/oss/quarkus/runtime/api/config/CassandraClientConnectionConfig.java b/runtime/src/main/java/com/datastax/oss/quarkus/runtime/api/config/CassandraClientConnectionConfig.java index 8410fb21..ec242eed 100644 --- a/runtime/src/main/java/com/datastax/oss/quarkus/runtime/api/config/CassandraClientConnectionConfig.java +++ b/runtime/src/main/java/com/datastax/oss/quarkus/runtime/api/config/CassandraClientConnectionConfig.java @@ -16,13 +16,12 @@ package com.datastax.oss.quarkus.runtime.api.config; import io.quarkus.runtime.annotations.ConfigGroup; -import io.quarkus.runtime.annotations.ConfigItem; import java.util.List; import java.util.Optional; /** This class holds runtime configuration items related to connection settings. */ @ConfigGroup -public class CassandraClientConnectionConfig { +public interface CassandraClientConnectionConfig { /** * Contact-points used to connect to Apache Cassandra (R) or DataStax Enterprise (DSE). @@ -31,16 +30,14 @@ public class CassandraClientConnectionConfig { * *

This setting is not required to connect to DataStax Astra. */ - @ConfigItem(name = "contact-points") - public Optional> contactPoints; + Optional> contactPoints(); /** * Local datacenter used to connect to Apache Cassandra (R) or DataStax Enterprise (DSE). * *

This setting is not required to connect to DataStax Astra. */ - @ConfigItem(name = "local-datacenter") - public Optional localDatacenter; + Optional localDatacenter(); /** * The name of the keyspace that the session should initially be connected to. @@ -57,5 +54,5 @@ public class CassandraClientConnectionConfig { * either qualify table names in your queries, or use the per-query keyspace feature available in * Cassandra 4 and above. */ - public Optional keyspace; + Optional keyspace(); } diff --git a/runtime/src/main/java/com/datastax/oss/quarkus/runtime/api/config/CassandraClientGraphConfig.java b/runtime/src/main/java/com/datastax/oss/quarkus/runtime/api/config/CassandraClientGraphConfig.java index a42509b4..6b945a21 100644 --- a/runtime/src/main/java/com/datastax/oss/quarkus/runtime/api/config/CassandraClientGraphConfig.java +++ b/runtime/src/main/java/com/datastax/oss/quarkus/runtime/api/config/CassandraClientGraphConfig.java @@ -17,17 +17,17 @@ import com.datastax.oss.driver.api.core.ConsistencyLevel; import io.quarkus.runtime.annotations.ConfigGroup; -import io.quarkus.runtime.annotations.ConfigItem; +import io.smallrye.config.WithName; import java.time.Duration; import java.util.Optional; /** This class holds runtime configuration items related to DSE Graph settings. */ @ConfigGroup -public class CassandraClientGraphConfig { +public interface CassandraClientGraphConfig { /** The name of the graph targeted by graph statements. */ - @ConfigItem(name = "name") - public Optional graphName; + @WithName("name") + Optional graphName(); /** * How long the driver waits for a graph request to complete. @@ -45,8 +45,8 @@ public class CassandraClientGraphConfig { *

If this value is left unset (default) or is explicitly set to zero, no timeout will be * applied. */ - @ConfigItem(name = "request.timeout") - public Optional graphRequestTimeout; + @WithName("request.timeout") + Optional graphRequestTimeout(); /** * The read consistency level to use for graph statements. If not specified, it defaults to {@link @@ -56,8 +56,8 @@ public class CassandraClientGraphConfig { * queries that will be produced by a traversal. Hence the consistency level for reads and writes * can be set separately. */ - @ConfigItem(name = "read-consistency-level") - public Optional graphReadConsistencyLevel; + @WithName("read-consistency-level") + Optional graphReadConsistencyLevel(); /** * The write consistency level to use for graph statements. If not specified, it defaults to @@ -67,6 +67,6 @@ public class CassandraClientGraphConfig { * queries that will be produced by a traversal. Hence the consistency level for reads and writes * can be set separately. */ - @ConfigItem(name = "write-consistency-level") - public Optional graphWriteConsistencyLevel; + @WithName("write-consistency-level") + Optional graphWriteConsistencyLevel(); } diff --git a/runtime/src/main/java/com/datastax/oss/quarkus/runtime/api/config/CassandraClientInitConfig.java b/runtime/src/main/java/com/datastax/oss/quarkus/runtime/api/config/CassandraClientInitConfig.java index 760e155f..b7e3da5f 100644 --- a/runtime/src/main/java/com/datastax/oss/quarkus/runtime/api/config/CassandraClientInitConfig.java +++ b/runtime/src/main/java/com/datastax/oss/quarkus/runtime/api/config/CassandraClientInitConfig.java @@ -16,12 +16,12 @@ package com.datastax.oss.quarkus.runtime.api.config; import io.quarkus.runtime.annotations.ConfigGroup; -import io.quarkus.runtime.annotations.ConfigItem; +import io.smallrye.config.WithDefault; import java.time.Duration; /** This class holds runtime configuration items related to session initialization. */ @ConfigGroup -public class CassandraClientInitConfig { +public interface CassandraClientInitConfig { /** * Whether to eagerly initialize the Cassandra client at application startup. This includes the @@ -40,8 +40,8 @@ public class CassandraClientInitConfig { * *

The default is false. */ - @ConfigItem(name = "eager-init", defaultValue = "false") - public boolean eagerInit; + @WithDefault("false") + boolean eagerInit(); /** * How long to wait for the Cassandra client to initialize at application startup. Ignored when @@ -55,8 +55,8 @@ public class CassandraClientInitConfig { * *

The default is 10 seconds. */ - @ConfigItem(name = "eager-init-timeout", defaultValue = "PT10S") - public Duration eagerInitTimeout; + @WithDefault("PT10S") + Duration eagerInitTimeout(); /** * Whether to log an informational message explaining how to best use eager initialization. @@ -69,8 +69,8 @@ public class CassandraClientInitConfig { * application threads. An informational message will be logged if this rule in infringed, unless * this option is set to false. */ - @ConfigItem(name = "print-eager-init-info", defaultValue = "true") - public boolean printEagerInitInfo; + @WithDefault("true") + boolean printEagerInitInfo(); /** * Whether to try to reconnect if the first connection attempt fails. @@ -83,8 +83,8 @@ public class CassandraClientInitConfig { * *

The default is true. */ - @ConfigItem(name = "reconnect-on-init", defaultValue = "true") - public boolean reconnectOnInit; + @WithDefault("true") + boolean reconnectOnInit(); /** * Whether to resolve contact points eagerly when initializing the session. @@ -102,8 +102,8 @@ public class CassandraClientInitConfig { * *

The default is false. */ - @ConfigItem(name = "resolve-contact-points", defaultValue = "false") - public boolean resolveContactPoints; + @WithDefault("false") + boolean resolveContactPoints(); /** * Whether the DataStax Java driver should use the main Netty event loop group provided by Quarkus @@ -128,6 +128,6 @@ public class CassandraClientInitConfig { * * @see Quarkus Vert.x reference guide */ - @ConfigItem(name = "use-quarkus-event-loop", defaultValue = "true") - public boolean useQuarkusEventLoop; + @WithDefault("true") + boolean useQuarkusEventLoop(); } diff --git a/runtime/src/main/java/com/datastax/oss/quarkus/runtime/api/config/CassandraClientMetricsConfig.java b/runtime/src/main/java/com/datastax/oss/quarkus/runtime/api/config/CassandraClientMetricsConfig.java index df786afd..061d4f6b 100644 --- a/runtime/src/main/java/com/datastax/oss/quarkus/runtime/api/config/CassandraClientMetricsConfig.java +++ b/runtime/src/main/java/com/datastax/oss/quarkus/runtime/api/config/CassandraClientMetricsConfig.java @@ -16,13 +16,14 @@ package com.datastax.oss.quarkus.runtime.api.config; import io.quarkus.runtime.annotations.ConfigGroup; -import io.quarkus.runtime.annotations.ConfigItem; +import io.smallrye.config.WithDefault; +import io.smallrye.config.WithName; import java.util.List; import java.util.Optional; /** This class holds runtime configuration items related to metrics. */ @ConfigGroup -public class CassandraClientMetricsConfig { +public interface CassandraClientMetricsConfig { /** * The metric names specified here will be taken into account only if metrics are globally @@ -43,15 +44,14 @@ public class CassandraClientMetricsConfig { * href="https://docs.datastax.com/en/developer/java-driver/latest/manual/core/metrics/#configuration"> * Metrics configuration in the Java driver manual. */ - @ConfigItem( - name = "session.enabled", - defaultValue = - "bytes-sent," - + "bytes-received," - + "connected-nodes," - + "cql-requests," - + "cql-client-timeouts") - public Optional> enabledSessionMetrics; + @WithName("session.enabled") + @WithDefault( + "bytes-sent," + + "bytes-received," + + "connected-nodes," + + "cql-requests," + + "cql-client-timeouts") + Optional> enabledSessionMetrics(); /** * List of node-level metric names to enable. @@ -74,36 +74,35 @@ public class CassandraClientMetricsConfig { * href="https://docs.datastax.com/en/developer/java-driver/latest/manual/core/metrics/#configuration"> * Metrics configuration in the Java driver manual. */ - @ConfigItem( - name = "node.enabled", - defaultValue = - "pool.open-connections," - + "pool.in-flight," - + "bytes-sent," - + "bytes-received," - + "cql-messages," - + "errors.request.unsent," - + "errors.request.aborted," - + "errors.request.write-timeouts," - + "errors.request.read-timeouts," - + "errors.request.unavailables," - + "errors.request.others," - + "errors.connection.init," - + "errors.connection.auth," - + "retries.total," - + "retries.aborted," - + "retries.read-timeout," - + "retries.write-timeout," - + "retries.unavailable," - + "retries.other," - + "ignores.total," - + "ignores.aborted," - + "ignores.read-timeout," - + "ignores.write-timeout," - + "ignores.unavailable," - + "ignores.other," - + "speculative-executions") - public Optional> enabledNodeMetrics; + @WithName("node.enabled") + @WithDefault( + "pool.open-connections," + + "pool.in-flight," + + "bytes-sent," + + "bytes-received," + + "cql-messages," + + "errors.request.unsent," + + "errors.request.aborted," + + "errors.request.write-timeouts," + + "errors.request.read-timeouts," + + "errors.request.unavailables," + + "errors.request.others," + + "errors.connection.init," + + "errors.connection.auth," + + "retries.total," + + "retries.aborted," + + "retries.read-timeout," + + "retries.write-timeout," + + "retries.unavailable," + + "retries.other," + + "ignores.total," + + "ignores.aborted," + + "ignores.read-timeout," + + "ignores.write-timeout," + + "ignores.unavailable," + + "ignores.other," + + "speculative-executions") + Optional> enabledNodeMetrics(); /** * The prefix for metric names. @@ -120,6 +119,6 @@ public class CassandraClientMetricsConfig { * href="https://docs.datastax.com/en/developer/java-driver/latest/manual/core/metrics/#configuration"> * Metrics configuration in the Java driver manual. */ - @ConfigItem(name = "prefix", defaultValue = "cassandra") - public String prefix; + @WithDefault("cassandra") + String prefix(); } diff --git a/runtime/src/main/java/com/datastax/oss/quarkus/runtime/api/config/CassandraClientRequestConfig.java b/runtime/src/main/java/com/datastax/oss/quarkus/runtime/api/config/CassandraClientRequestConfig.java index 2a7560fd..88c067e2 100644 --- a/runtime/src/main/java/com/datastax/oss/quarkus/runtime/api/config/CassandraClientRequestConfig.java +++ b/runtime/src/main/java/com/datastax/oss/quarkus/runtime/api/config/CassandraClientRequestConfig.java @@ -17,14 +17,14 @@ import com.datastax.oss.driver.api.core.ConsistencyLevel; import io.quarkus.runtime.annotations.ConfigGroup; -import io.quarkus.runtime.annotations.ConfigItem; +import io.smallrye.config.WithName; import java.time.Duration; import java.util.Optional; import java.util.OptionalInt; /** This class holds runtime configuration items related to connection settings. */ @ConfigGroup -public class CassandraClientRequestConfig { +public interface CassandraClientRequestConfig { /** * How long the driver waits for a request to complete. If not specified, it defaults to 2 @@ -41,28 +41,24 @@ public class CassandraClientRequestConfig { * DDL and DML; you can then set the DML timeout much lower (down to a few milliseconds if * needed). */ - @ConfigItem(name = "timeout") - public Optional requestTimeout; + @WithName("timeout") + Optional requestTimeout(); /** * The default consistency level to use. If not specified, it defaults to {@link * ConsistencyLevel#LOCAL_ONE}. */ - @ConfigItem(name = "consistency-level") - public Optional consistencyLevel; + Optional consistencyLevel(); /** * The default serial consistency level to use. If not specified, it defaults to {@link * ConsistencyLevel#SERIAL}. */ - @ConfigItem(name = "serial-consistency-level") - public Optional serialConsistencyLevel; + Optional serialConsistencyLevel(); /** The default page size to use. If not specified, it defaults to 5000. */ - @ConfigItem(name = "page-size") - public OptionalInt pageSize; + OptionalInt pageSize(); /** The default idempotence of a request. If not specified, it defaults to false. */ - @ConfigItem(name = "default-idempotence") - public Optional defaultIdempotence; + Optional defaultIdempotence(); } diff --git a/runtime/src/main/java/com/datastax/oss/quarkus/runtime/internal/quarkus/CassandraClientProducer.java b/runtime/src/main/java/com/datastax/oss/quarkus/runtime/internal/quarkus/CassandraClientProducer.java index dd72b43e..4d6058e3 100644 --- a/runtime/src/main/java/com/datastax/oss/quarkus/runtime/internal/quarkus/CassandraClientProducer.java +++ b/runtime/src/main/java/com/datastax/oss/quarkus/runtime/internal/quarkus/CassandraClientProducer.java @@ -73,7 +73,7 @@ public CompletionStage produceQuarkusCqlSessionStage( LOG.debug( "Producing CompletionStage bean, metricRegistry = {}, useQuarkusEventLoop = {}", metricRegistry, - config.cassandraClientInitConfig.useQuarkusEventLoop); + config.cassandraClientInitConfig().useQuarkusEventLoop()); ProgrammaticDriverConfigLoaderBuilder configLoaderBuilder = createDriverConfigLoaderBuilder(); configureRuntimeSettings(configLoaderBuilder, config); configureMetricsSettings(configLoaderBuilder, config); @@ -87,7 +87,7 @@ public CompletionStage produceQuarkusCqlSessionStage( LOG.debug("Metric registry = {}", metricRegistry); builder.withMetricRegistry(metricRegistry); } - if (config.cassandraClientInitConfig.useQuarkusEventLoop) { + if (config.cassandraClientInitConfig().useQuarkusEventLoop()) { if (mainEventLoop instanceof MultithreadEventExecutorGroup) { // Check event loop group size. The default in Quarkus is 2 * cores, which is usually fine. // https://quarkus.io/guides/vertx-reference#quarkus-vertx-core_quarkus.vertx.event-loops-pool-size @@ -117,9 +117,9 @@ public QuarkusCqlSession produceQuarkusCqlSession( throws ExecutionException, InterruptedException { LOG.debug( "Producing QuarkusCqlSession bean, eagerSessionInit = {}", - config.cassandraClientInitConfig.eagerInit); - if (!config.cassandraClientInitConfig.eagerInit - && config.cassandraClientInitConfig.printEagerInitInfo) { + config.cassandraClientInitConfig().eagerInit()); + if (!config.cassandraClientInitConfig().eagerInit() + && config.cassandraClientInitConfig().printEagerInitInfo()) { LOG.info( "Injecting QuarkusCqlSession and setting quarkus.cassandra.init.eager-init = false " + "may cause problems if the lazy initialization process " @@ -211,9 +211,15 @@ private void configureMetricsSettings( ProgrammaticDriverConfigLoaderBuilder configLoaderBuilder, CassandraClientConfig config) { if (metricRegistry != null && metricsFactoryClass != null) { List enabledNodeMetrics = - config.cassandraClientMetricsConfig.enabledNodeMetrics.orElse(Collections.emptyList()); + config + .cassandraClientMetricsConfig() + .enabledNodeMetrics() + .orElse(Collections.emptyList()); List enabledSessionMetrics = - config.cassandraClientMetricsConfig.enabledSessionMetrics.orElse(Collections.emptyList()); + config + .cassandraClientMetricsConfig() + .enabledSessionMetrics() + .orElse(Collections.emptyList()); if (checkMetricsPresent(enabledNodeMetrics, enabledSessionMetrics)) { configLoaderBuilder.withString( DefaultDriverOption.METRICS_FACTORY_CLASS, metricsFactoryClass); @@ -222,7 +228,7 @@ private void configureMetricsSettings( TaggingMetricIdGenerator.class.getName()); configLoaderBuilder.withString( DefaultDriverOption.METRICS_ID_GENERATOR_PREFIX, - config.cassandraClientMetricsConfig.prefix); + config.cassandraClientMetricsConfig().prefix()); configLoaderBuilder.withStringList( DefaultDriverOption.METRICS_NODE_ENABLED, enabledNodeMetrics); configLoaderBuilder.withStringList( @@ -246,56 +252,93 @@ private boolean checkMetricsPresent( private void configureRuntimeSettings( ProgrammaticDriverConfigLoaderBuilder configLoaderBuilder, CassandraClientConfig config) { // connection settings - config.cassandraClientConnectionConfig.contactPoints.ifPresent( - v -> configLoaderBuilder.withStringList(DefaultDriverOption.CONTACT_POINTS, v)); - config.cassandraClientConnectionConfig.localDatacenter.ifPresent( - v -> - configLoaderBuilder.withString(DefaultDriverOption.LOAD_BALANCING_LOCAL_DATACENTER, v)); - config.cassandraClientConnectionConfig.keyspace.ifPresent( - v -> configLoaderBuilder.withString(DefaultDriverOption.SESSION_KEYSPACE, v)); + config + .cassandraClientConnectionConfig() + .contactPoints() + .ifPresent(v -> configLoaderBuilder.withStringList(DefaultDriverOption.CONTACT_POINTS, v)); + config + .cassandraClientConnectionConfig() + .localDatacenter() + .ifPresent( + v -> + configLoaderBuilder.withString( + DefaultDriverOption.LOAD_BALANCING_LOCAL_DATACENTER, v)); + config + .cassandraClientConnectionConfig() + .keyspace() + .ifPresent(v -> configLoaderBuilder.withString(DefaultDriverOption.SESSION_KEYSPACE, v)); // cloud settings - config.cassandraClientCloudConfig.secureConnectBundle.ifPresent( - v -> - configLoaderBuilder.withString( - DefaultDriverOption.CLOUD_SECURE_CONNECT_BUNDLE, v.toAbsolutePath().toString())); + config + .cassandraClientCloudConfig() + .secureConnectBundle() + .ifPresent( + v -> + configLoaderBuilder.withString( + DefaultDriverOption.CLOUD_SECURE_CONNECT_BUNDLE, + v.toAbsolutePath().toString())); // init settings configLoaderBuilder.withBoolean( DefaultDriverOption.RESOLVE_CONTACT_POINTS, - config.cassandraClientInitConfig.resolveContactPoints); + config.cassandraClientInitConfig().resolveContactPoints()); configLoaderBuilder.withBoolean( - DefaultDriverOption.RECONNECT_ON_INIT, config.cassandraClientInitConfig.reconnectOnInit); + DefaultDriverOption.RECONNECT_ON_INIT, + config.cassandraClientInitConfig().reconnectOnInit()); // request settings - config.cassandraClientRequestConfig.requestTimeout.ifPresent( - v -> configLoaderBuilder.withDuration(DefaultDriverOption.REQUEST_TIMEOUT, v)); - config.cassandraClientRequestConfig.consistencyLevel.ifPresent( - v -> configLoaderBuilder.withString(DefaultDriverOption.REQUEST_CONSISTENCY, v)); - config.cassandraClientRequestConfig.serialConsistencyLevel.ifPresent( - v -> configLoaderBuilder.withString(DefaultDriverOption.REQUEST_SERIAL_CONSISTENCY, v)); - config.cassandraClientRequestConfig.pageSize.ifPresent( - v -> configLoaderBuilder.withInt(DefaultDriverOption.REQUEST_PAGE_SIZE, v)); - config.cassandraClientRequestConfig.defaultIdempotence.ifPresent( - v -> configLoaderBuilder.withBoolean(DefaultDriverOption.REQUEST_DEFAULT_IDEMPOTENCE, v)); + config + .cassandraClientRequestConfig() + .requestTimeout() + .ifPresent(v -> configLoaderBuilder.withDuration(DefaultDriverOption.REQUEST_TIMEOUT, v)); + config + .cassandraClientRequestConfig() + .consistencyLevel() + .ifPresent(v -> configLoaderBuilder.withString(DefaultDriverOption.REQUEST_CONSISTENCY, v)); + config + .cassandraClientRequestConfig() + .serialConsistencyLevel() + .ifPresent( + v -> configLoaderBuilder.withString(DefaultDriverOption.REQUEST_SERIAL_CONSISTENCY, v)); + config + .cassandraClientRequestConfig() + .pageSize() + .ifPresent(v -> configLoaderBuilder.withInt(DefaultDriverOption.REQUEST_PAGE_SIZE, v)); + config + .cassandraClientRequestConfig() + .defaultIdempotence() + .ifPresent( + v -> + configLoaderBuilder.withBoolean( + DefaultDriverOption.REQUEST_DEFAULT_IDEMPOTENCE, v)); // auth settings - if (config.cassandraClientAuthConfig.username.isPresent() - && config.cassandraClientAuthConfig.password.isPresent()) { + if (config.cassandraClientAuthConfig().username().isPresent() + && config.cassandraClientAuthConfig().password().isPresent()) { configLoaderBuilder .withClass(DefaultDriverOption.AUTH_PROVIDER_CLASS, PlainTextAuthProvider.class) .withString( DefaultDriverOption.AUTH_PROVIDER_USER_NAME, - config.cassandraClientAuthConfig.username.get()) + config.cassandraClientAuthConfig().username().get()) .withString( DefaultDriverOption.AUTH_PROVIDER_PASSWORD, - config.cassandraClientAuthConfig.password.get()); + config.cassandraClientAuthConfig().password().get()); } // graph settings - config.cassandraClientGraphConfig.graphName.ifPresent( - v -> configLoaderBuilder.withString(DseDriverOption.GRAPH_NAME, v)); - config.cassandraClientGraphConfig.graphReadConsistencyLevel.ifPresent( - v -> configLoaderBuilder.withString(DseDriverOption.GRAPH_READ_CONSISTENCY_LEVEL, v)); - config.cassandraClientGraphConfig.graphWriteConsistencyLevel.ifPresent( - v -> configLoaderBuilder.withString(DseDriverOption.GRAPH_WRITE_CONSISTENCY_LEVEL, v)); - config.cassandraClientGraphConfig.graphRequestTimeout.ifPresent( - v -> configLoaderBuilder.withDuration(DseDriverOption.GRAPH_TIMEOUT, v)); + config + .cassandraClientGraphConfig() + .graphName() + .ifPresent(v -> configLoaderBuilder.withString(DseDriverOption.GRAPH_NAME, v)); + config + .cassandraClientGraphConfig() + .graphReadConsistencyLevel() + .ifPresent( + v -> configLoaderBuilder.withString(DseDriverOption.GRAPH_READ_CONSISTENCY_LEVEL, v)); + config + .cassandraClientGraphConfig() + .graphWriteConsistencyLevel() + .ifPresent( + v -> configLoaderBuilder.withString(DseDriverOption.GRAPH_WRITE_CONSISTENCY_LEVEL, v)); + config + .cassandraClientGraphConfig() + .graphRequestTimeout() + .ifPresent(v -> configLoaderBuilder.withDuration(DseDriverOption.GRAPH_TIMEOUT, v)); } public boolean isProduced() { diff --git a/runtime/src/main/java/com/datastax/oss/quarkus/runtime/internal/quarkus/CassandraClientRecorder.java b/runtime/src/main/java/com/datastax/oss/quarkus/runtime/internal/quarkus/CassandraClientRecorder.java index a54dd7c6..9f46a80d 100644 --- a/runtime/src/main/java/com/datastax/oss/quarkus/runtime/internal/quarkus/CassandraClientRecorder.java +++ b/runtime/src/main/java/com/datastax/oss/quarkus/runtime/internal/quarkus/CassandraClientRecorder.java @@ -104,7 +104,9 @@ public void configureMicroProfileMetrics() { } private Object locateMicroProfileVendorMetricRegistry() - throws ClassNotFoundException, IllegalAccessException, InvocationTargetException, + throws ClassNotFoundException, + IllegalAccessException, + InvocationTargetException, NoSuchMethodException { Class metricRegistriesClass = Class.forName("io.smallrye.metrics.MetricRegistries"); Object metricRegistries = Arc.container().instance(metricRegistriesClass).get(); diff --git a/runtime/src/main/java/com/datastax/oss/quarkus/runtime/internal/quarkus/CassandraClientStarter.java b/runtime/src/main/java/com/datastax/oss/quarkus/runtime/internal/quarkus/CassandraClientStarter.java index 74563490..3ebce569 100644 --- a/runtime/src/main/java/com/datastax/oss/quarkus/runtime/internal/quarkus/CassandraClientStarter.java +++ b/runtime/src/main/java/com/datastax/oss/quarkus/runtime/internal/quarkus/CassandraClientStarter.java @@ -59,14 +59,14 @@ public void onStartup(@Observes StartupEvent event) if (LOG.isDebugEnabled()) { LOG.debug( "CassandraClientStarter.startup, eager = {}, sessions = {}, mappers = {}, daos = {}", - config.cassandraClientInitConfig.eagerInit, + config.cassandraClientInitConfig().eagerInit(), sessions.stream().count(), mappers.stream().count(), daos.stream().count()); } - if (config.cassandraClientInitConfig.eagerInit) { + if (config.cassandraClientInitConfig().eagerInit()) { LOG.info("Eagerly initializing Quarkus Cassandra client."); - Duration timeout = config.cassandraClientInitConfig.eagerInitTimeout; + Duration timeout = config.cassandraClientInitConfig().eagerInitTimeout(); ExecutorService executor = Executors.newSingleThreadExecutor(); Future initFuture = executor.submit(