JiriOndrusek commented on code in PR #7634:
URL: https://github.com/apache/camel-quarkus/pull/7634#discussion_r2276818803
##########
extensions-support/debezium/deployment/src/main/java/org/apache/camel/quarkus/support/debezium/deployment/DebeziumSupportProcessor.java:
##########
@@ -24,45 +50,104 @@
import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
import
io.quarkus.deployment.builditem.nativeimage.RuntimeInitializedClassBuildItem;
import org.apache.kafka.common.security.authenticator.SaslClientAuthenticator;
+import org.apache.kafka.connect.json.JsonConverter;
+import org.apache.kafka.connect.source.SourceTask;
+import org.jboss.jandex.DotName;
import org.jboss.jandex.IndexView;
public class DebeziumSupportProcessor {
@BuildStep
- ReflectiveClassBuildItem registerForReflection(CombinedIndexBuildItem
combinedIndex) {
+ void addDependencies(BuildProducer<IndexDependencyBuildItem>
indexDependency) {
+ indexDependency.produce(new
IndexDependencyBuildItem("org.apache.kafka", "connect-json"));
+ indexDependency.produce(new IndexDependencyBuildItem("io.debezium",
"debezium-api"));
+ }
+
+ @BuildStep
+ RuntimeInitializedClassBuildItem runtimeInitializedClasses() {
+ return new
RuntimeInitializedClassBuildItem(SaslClientAuthenticator.class.getName());
+ }
+
+ @BuildStep
+ void reflectiveClasses(CombinedIndexBuildItem combinedIndex,
BuildProducer<ReflectiveClassBuildItem> reflectiveClasses) {
IndexView index = combinedIndex.getIndex();
String[] dtos = index.getKnownClasses().stream().map(ci ->
ci.name().toString())
.filter(n -> n.startsWith("org.apache.kafka.connect.json")
|| n.startsWith("io.debezium.engine.spi"))
.sorted()
.toArray(String[]::new);
+
reflectiveClasses.produce(ReflectiveClassBuildItem.builder(dtos).fields().build());
- return ReflectiveClassBuildItem.builder(dtos).fields().build();
- }
+ dtos =
index.getAllKnownImplementations(DotName.createSimple(SnapshotLock.class.getName())).stream()
+ .map(ci -> ci.name().toString())
+ .sorted()
+ .toArray(String[]::new);
+
reflectiveClasses.produce(ReflectiveClassBuildItem.builder(dtos).fields().build());
- @BuildStep
- ReflectiveClassBuildItem reflectiveClasses() {
- return ReflectiveClassBuildItem.builder(new String[] {
"org.apache.kafka.connect.storage.FileOffsetBackingStore",
+ reflectiveClasses.produce(ReflectiveClassBuildItem.builder(
+ "org.apache.kafka.connect.storage.FileOffsetBackingStore",
"org.apache.kafka.connect.storage.MemoryOffsetBackingStore",
+ "io.debezium.storage.kafka.history.KafkaSchemaHistory",
"io.debezium.relational.history.FileDatabaseHistory",
- "io.debezium.embedded.ConvertingEngineBuilderFactory"
}).build();
- }
+ "io.debezium.embedded.ConvertingEngineBuilderFactory",
+ "io.debezium.processors.PostProcessorRegistry",
+
"io.debezium.pipeline.txmetadata.DefaultTransactionMetadataFactory",
+ "io.debezium.schema.SchemaTopicNamingStrategy",
+ "io.debezium.storage.file.history.FileSchemaHistory")
+ .build());
- @BuildStep
- void addDependencies(BuildProducer<IndexDependencyBuildItem>
indexDependency) {
- indexDependency.produce(new
IndexDependencyBuildItem("org.apache.kafka", "connect-json"));
- indexDependency.produce(new IndexDependencyBuildItem("io.debezium",
"debezium-api"));
+ reflectiveClasses.produce(ReflectiveClassBuildItem.builder(
+ DebeziumEngine.BuilderFactory.class,
+ ConvertingAsyncEngineBuilderFactory.class,
+ SaslClientAuthenticator.class,
+ JsonConverter.class,
+ DefaultTransactionMetadataFactory.class,
+ SchemaTopicNamingStrategy.class,
+ BaseSourceTask.class,
+ SinkNotificationChannel.class,
+ LogNotificationChannel.class,
+ JmxNotificationChannel.class,
+ SnapshotLock.class,
+ NoLockingSupport.class,
+ AlwaysSnapshotter.class,
+ InitialSnapshotter.class,
+ InitialOnlySnapshotter.class,
+ NoDataSnapshotter.class,
+ RecoverySnapshotter.class,
+ WhenNeededSnapshotter.class,
+ NeverSnapshotter.class,
+ SchemaOnlySnapshotter.class,
+ SchemaOnlyRecoverySnapshotter.class,
+ ConfigurationBasedSnapshotter.class,
+ SourceSignalChannel.class,
+ KafkaSignalChannel.class,
+ FileSignalChannel.class,
+ JmxSignalChannel.class,
+ InProcessSignalChannel.class,
+ StandardActionProvider.class,
+ SourceTask.class)
+ .build());
}
- @BuildStep
- void registerServiceProviders(BuildProducer<NativeImageResourceBuildItem>
nativeImage) {
- nativeImage.produce(
+ @BuildStep()
+ void
registerNativeImageResources(BuildProducer<NativeImageResourceBuildItem>
resources) {
+ resources.produce(new NativeImageResourceBuildItem(
+
"META-INF/services/io.debezium.embedded.async.ConvertingAsyncEngineBuilderFactory"));
+ resources.produce(
new
NativeImageResourceBuildItem("META-INF/services/io.debezium.engine.DebeziumEngine$BuilderFactory"));
- }
+ resources.produce(new
NativeImageResourceBuildItem("META-INF/services/io.debezium.spi.snapshot.Snapshotter"));
+ resources.produce(new
NativeImageResourceBuildItem("META-INF/services/io.debezium.spi.snapshot.Snapshotter"));
Review Comment:
@jamesnetherton I've just relized that the
`META-INF/services/io.debezium.embedded.async.ConvertingAsyncEngineBuilderFactory`
is a better sokution.
In case the app contains only `debezium-postgresql' the file contains i.e.
```
io.debezium.connector.postgresql.snapshot.lock.NoSnapshotLock
io.debezium.connector.postgresql.snapshot.lock.SharedSnapshotLock
```
the same file for debezium oracle contains
```
io.debezium.connector.oracle.snapshot.lock.NoSnapshotLock
io.debezium.connector.oracle.snapshot.lock.SharedSnapshotLock
```
therefore we an keel those `META-INF` in debezium-support or we can list all
services for each flavor of debezium.
What do you prefer?
I'd say that keeping meta-inf files (as is) would cause small number of
issues, I'd say....
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]