diff --git a/docs/src/main/asciidoc/kafka-schema-registry-avro.adoc b/docs/src/main/asciidoc/kafka-schema-registry-avro.adoc index 3d944ec0bafb7..b7b242cfd7ba2 100644 --- a/docs/src/main/asciidoc/kafka-schema-registry-avro.adoc +++ b/docs/src/main/asciidoc/kafka-schema-registry-avro.adoc @@ -53,70 +53,7 @@ include::{includes}/devtools/create-app.adoc[] ==== If you use Confluent Schema Registry, you don't need the `quarkus-apicurio-registry-avro` extension. Instead, you need the `quarkus-confluent-registry-avro` extension and a few more dependencies. -Also, you need to add the Confluent Maven repository to your build file: - -[source,xml,role="primary asciidoc-tabs-target-sync-cli asciidoc-tabs-target-sync-maven"] -.pom.xml ----- - - ... - - io.quarkus - quarkus-confluent-registry-avro - - - - io.quarkus - quarkus-rest-client-reactive - - - io.confluent - kafka-avro-serializer - 6.1.1 - - - jakarta.ws.rs - jakarta.ws.rs-api - - - - - - - - confluent - https://packages.confluent.io/maven/ - - false - - - ----- - -[source,gradle,role="secondary asciidoc-tabs-target-sync-gradle"] -.build.gradle ----- -repositories { - ... - - maven { - url "https://packages.confluent.io/maven/" - } -} - -dependencies { - ... - - implementation("io.quarkus:quarkus-confluent-registry-avro") - - // Confluent registry libraries use JAX-RS client - implementation("io.quarkus:quarkus-rest-client-reactive") - - implementation("io.confluent:kafka-avro-serializer:6.1.1") { - exclude group: "jakarta.ws.rs", module: "jakarta.ws.rs-api" - } -} ----- +See <> for details. ==== == Avro schema @@ -673,6 +610,87 @@ public class MovieResourceTest { } ---- +[[confluent]] +== Using the Confluent Schema Registry + +If you want to use the Confluent Schema Registry, you need the `quarkus-confluent-registry-avro` extension, instead of the `quarkus-apicurio-registry-avro` extension. +Also, you need to add a few dependencies and a custom Maven repository to your `pom.xml` / `build.gradle` file: + +[source,xml,role="primary asciidoc-tabs-target-sync-cli asciidoc-tabs-target-sync-maven"] +.pom.xml +---- + + ... + + + io.quarkus + quarkus-confluent-registry-avro + + + + io.quarkus + quarkus-rest-client-reactive + + + io.confluent + kafka-avro-serializer + 7.2.0 + + + jakarta.ws.rs + jakarta.ws.rs-api + + + + + + + + + confluent + https://packages.confluent.io/maven/ + + false + + + +---- + +[source,gradle,role="secondary asciidoc-tabs-target-sync-gradle"] +.build.gradle +---- +repositories { + ... + + maven { + url "https://packages.confluent.io/maven/" + } +} + +dependencies { + ... + + implementation("io.quarkus:quarkus-confluent-registry-avro") + + // Confluent registry libraries use JAX-RS client + implementation("io.quarkus:quarkus-rest-client-reactive") + + implementation("io.confluent:kafka-avro-serializer:7.2.0") { + exclude group: "jakarta.ws.rs", module: "jakarta.ws.rs-api" + } +} +---- + +In JVM mode, any version of `io.confluent:kafka-avro-serializer` can be used. +In native mode, Quarkus only supports the following versions: + +* 6.2.x +* 7.0.x +* 7.1.x +* 7.2.x + +For any other versions, the native configuration may need to be adjusted. + == Avro code generation details In this guide we used the Quarkus code generation mechanism to generate Java files diff --git a/extensions/schema-registry/confluent/avro/deployment/src/main/java/io/quarkus/confluent/registry/avro/ConfluentRegistryAvroProcessor.java b/extensions/schema-registry/confluent/avro/deployment/src/main/java/io/quarkus/confluent/registry/avro/ConfluentRegistryAvroProcessor.java index ee0f05e8a3a73..e2318f783a938 100644 --- a/extensions/schema-registry/confluent/avro/deployment/src/main/java/io/quarkus/confluent/registry/avro/ConfluentRegistryAvroProcessor.java +++ b/extensions/schema-registry/confluent/avro/deployment/src/main/java/io/quarkus/confluent/registry/avro/ConfluentRegistryAvroProcessor.java @@ -1,15 +1,39 @@ package io.quarkus.confluent.registry.avro; +import java.util.Collection; +import java.util.Optional; +import java.util.function.Predicate; + +import org.jboss.logging.Logger; + import io.quarkus.deployment.Feature; import io.quarkus.deployment.annotations.BuildProducer; import io.quarkus.deployment.annotations.BuildStep; import io.quarkus.deployment.builditem.ExtensionSslNativeSupportBuildItem; import io.quarkus.deployment.builditem.FeatureBuildItem; +import io.quarkus.deployment.builditem.nativeimage.NativeImageConfigBuildItem; import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem; +import io.quarkus.deployment.pkg.builditem.CurateOutcomeBuildItem; +import io.quarkus.maven.dependency.ResolvedDependency; public class ConfluentRegistryAvroProcessor { + + public static final String CONFLUENT_GROUP_ID = "io.confluent"; + public static final String CONFLUENT_ARTIFACT_ID = "kafka-avro-serializer"; + + private static final Logger LOGGER = Logger.getLogger(ConfluentRegistryAvroProcessor.class.getName()); + public static final String CONFLUENT_REPO = "https://packages.confluent.io/maven/"; + public static final String GUIDE_URL = "https://quarkus.io/guides/kafka-schema-registry-avro"; + @BuildStep - FeatureBuildItem feature() { + FeatureBuildItem featureAndCheckDependency(CurateOutcomeBuildItem cp) { + if (findConfluentSerde(cp.getApplicationModel().getDependencies()).isEmpty()) { + LOGGER.warnf("The application uses the `quarkus-confluent-registry-avro` extension, but does not " + + "depend on `%s:%s`. Note that this dependency is only available from the `%s` Maven " + + "repository. Check %s for more details.", + CONFLUENT_GROUP_ID, CONFLUENT_ARTIFACT_ID, CONFLUENT_REPO, GUIDE_URL); + } + return new FeatureBuildItem(Feature.CONFLUENT_REGISTRY_AVRO); } @@ -22,9 +46,31 @@ public void confluentRegistryAvro(BuildProducer reflec "io.confluent.kafka.serializers.KafkaAvroSerializer")); } + @BuildStep + public void configureNative(BuildProducer config, CurateOutcomeBuildItem cp) { + Optional serde = findConfluentSerde(cp.getApplicationModel().getDependencies()); + if (serde.isPresent()) { + String version = serde.get().getVersion(); + if (version.startsWith("7.1") || version.startsWith("7.2")) { + // Only required for Confluent Serde 7.1.x and 7.2.x + config.produce(NativeImageConfigBuildItem.builder() + .addRuntimeInitializedClass("io.confluent.kafka.schemaregistry.client.rest.utils.UrlList").build()); + } + } + } + @BuildStep ExtensionSslNativeSupportBuildItem enableSslInNative() { return new ExtensionSslNativeSupportBuildItem(Feature.CONFLUENT_REGISTRY_AVRO); } + private Optional findConfluentSerde(Collection dependencies) { + return dependencies.stream().filter(new Predicate() { + @Override + public boolean test(ResolvedDependency rd) { + return rd.getGroupId().equalsIgnoreCase(CONFLUENT_GROUP_ID) + && rd.getArtifactId().equalsIgnoreCase(CONFLUENT_ARTIFACT_ID); + } + }).findAny(); + } }