From 01d73478d7fa11a074983f23d25a6d6198c4dce5 Mon Sep 17 00:00:00 2001 From: Anders Swanson Date: Tue, 20 May 2025 13:53:12 -0700 Subject: [PATCH 1/2] OSON Kafka Serializers Signed-off-by: Anders Swanson --- .../pom.xml | 4 ++-- .../pom.xml | 7 +++++++ .../JsonCollectionsAutoConfiguration.java | 12 +++++++++++ .../spring/json/kafka/OSONDeserializer.java} | 8 +++---- .../kafka/OSONKafkaSerializationFactory.java | 21 +++++++++++++++++++ .../spring/json/kafka/OSONSerializer.java} | 10 ++++----- .../jsonevents/OKafkaConfiguration.java | 17 +++++---------- 7 files changed, 56 insertions(+), 23 deletions(-) rename database/starters/{oracle-spring-boot-starter-samples/oracle-spring-boot-sample-json-events/src/main/java/com/oracle/database/spring/jsonevents/serde/JSONBDeserializer.java => oracle-spring-boot-json-data-tools/src/main/java/com/oracle/spring/json/kafka/OSONDeserializer.java} (70%) create mode 100644 database/starters/oracle-spring-boot-json-data-tools/src/main/java/com/oracle/spring/json/kafka/OSONKafkaSerializationFactory.java rename database/starters/{oracle-spring-boot-starter-samples/oracle-spring-boot-sample-json-events/src/main/java/com/oracle/database/spring/jsonevents/serde/JSONBSerializer.java => oracle-spring-boot-json-data-tools/src/main/java/com/oracle/spring/json/kafka/OSONSerializer.java} (60%) diff --git a/database/spring-cloud-stream-binder-oracle-txeventq/spring-cloud-stream-binder-txeventq-sample/pom.xml b/database/spring-cloud-stream-binder-oracle-txeventq/spring-cloud-stream-binder-txeventq-sample/pom.xml index afd26743..18cc1c1a 100644 --- a/database/spring-cloud-stream-binder-oracle-txeventq/spring-cloud-stream-binder-txeventq-sample/pom.xml +++ b/database/spring-cloud-stream-binder-oracle-txeventq/spring-cloud-stream-binder-txeventq-sample/pom.xml @@ -42,7 +42,7 @@ 17 17 - 0.12.0 + 0.13.0 3.4.3 1.20.6 @@ -86,4 +86,4 @@ test - \ No newline at end of file + diff --git a/database/starters/oracle-spring-boot-json-data-tools/pom.xml b/database/starters/oracle-spring-boot-json-data-tools/pom.xml index 14702fe5..7aa86061 100644 --- a/database/starters/oracle-spring-boot-json-data-tools/pom.xml +++ b/database/starters/oracle-spring-boot-json-data-tools/pom.xml @@ -48,6 +48,13 @@ + + + com.oracle.database.spring + oracle-spring-boot-starter-okafka + ${project.version} + true + com.oracle.database.spring oracle-spring-boot-starter-ucp diff --git a/database/starters/oracle-spring-boot-json-data-tools/src/main/java/com/oracle/spring/json/JsonCollectionsAutoConfiguration.java b/database/starters/oracle-spring-boot-json-data-tools/src/main/java/com/oracle/spring/json/JsonCollectionsAutoConfiguration.java index 0c454bf3..43e7f84f 100644 --- a/database/starters/oracle-spring-boot-json-data-tools/src/main/java/com/oracle/spring/json/JsonCollectionsAutoConfiguration.java +++ b/database/starters/oracle-spring-boot-json-data-tools/src/main/java/com/oracle/spring/json/JsonCollectionsAutoConfiguration.java @@ -3,8 +3,11 @@ package com.oracle.spring.json; import com.oracle.spring.json.jsonb.JSONB; +import com.oracle.spring.json.kafka.OSONKafkaSerializationFactory; import jakarta.json.bind.JsonbBuilder; import oracle.sql.json.OracleJsonFactory; +import org.apache.kafka.common.serialization.Deserializer; +import org.apache.kafka.common.serialization.Serializer; import org.eclipse.yasson.YassonJsonb; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -29,4 +32,13 @@ YassonJsonb yassonJsonb() { public JSONB jsonb(OracleJsonFactory oracleJsonFactory, YassonJsonb yassonJsonb) { return new JSONB(oracleJsonFactory, yassonJsonb); } + + @Bean + @ConditionalOnClass(value = { + Deserializer.class, + Serializer.class + }) + public OSONKafkaSerializationFactory osonSerializationFactory(JSONB jsonb) { + return new OSONKafkaSerializationFactory(jsonb); + } } diff --git a/database/starters/oracle-spring-boot-starter-samples/oracle-spring-boot-sample-json-events/src/main/java/com/oracle/database/spring/jsonevents/serde/JSONBDeserializer.java b/database/starters/oracle-spring-boot-json-data-tools/src/main/java/com/oracle/spring/json/kafka/OSONDeserializer.java similarity index 70% rename from database/starters/oracle-spring-boot-starter-samples/oracle-spring-boot-sample-json-events/src/main/java/com/oracle/database/spring/jsonevents/serde/JSONBDeserializer.java rename to database/starters/oracle-spring-boot-json-data-tools/src/main/java/com/oracle/spring/json/kafka/OSONDeserializer.java index 867f44cb..dd5568a2 100644 --- a/database/starters/oracle-spring-boot-starter-samples/oracle-spring-boot-sample-json-events/src/main/java/com/oracle/database/spring/jsonevents/serde/JSONBDeserializer.java +++ b/database/starters/oracle-spring-boot-json-data-tools/src/main/java/com/oracle/spring/json/kafka/OSONDeserializer.java @@ -1,6 +1,6 @@ // Copyright (c) 2024, Oracle and/or its affiliates. // Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. -package com.oracle.database.spring.jsonevents.serde; +package com.oracle.spring.json.kafka; import java.nio.ByteBuffer; @@ -8,14 +8,14 @@ import org.apache.kafka.common.serialization.Deserializer; /** - * The JSONBDeserializer converts JSONB byte arrays to java objects. + * The OSONDeserializer converts JSONB byte arrays to java objects. * @param deserialization type */ -public class JSONBDeserializer implements Deserializer { +public class OSONDeserializer implements Deserializer { private final JSONB jsonb; private final Class clazz; - public JSONBDeserializer(JSONB jsonb, Class clazz) { + public OSONDeserializer(JSONB jsonb, Class clazz) { this.jsonb = jsonb; this.clazz = clazz; } diff --git a/database/starters/oracle-spring-boot-json-data-tools/src/main/java/com/oracle/spring/json/kafka/OSONKafkaSerializationFactory.java b/database/starters/oracle-spring-boot-json-data-tools/src/main/java/com/oracle/spring/json/kafka/OSONKafkaSerializationFactory.java new file mode 100644 index 00000000..6e5c81aa --- /dev/null +++ b/database/starters/oracle-spring-boot-json-data-tools/src/main/java/com/oracle/spring/json/kafka/OSONKafkaSerializationFactory.java @@ -0,0 +1,21 @@ +// Copyright (c) 2024, Oracle and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +package com.oracle.spring.json.kafka; + +import com.oracle.spring.json.jsonb.JSONB; + +public class OSONKafkaSerializationFactory { + private final JSONB jsonb; + + public OSONKafkaSerializationFactory(JSONB jsonb) { + this.jsonb = jsonb; + } + + public OSONDeserializer createDeserializer(Class clazz) { + return new OSONDeserializer<>(jsonb, clazz); + } + + public OSONSerializer createSerializer() { + return new OSONSerializer<>(jsonb); + } +} diff --git a/database/starters/oracle-spring-boot-starter-samples/oracle-spring-boot-sample-json-events/src/main/java/com/oracle/database/spring/jsonevents/serde/JSONBSerializer.java b/database/starters/oracle-spring-boot-json-data-tools/src/main/java/com/oracle/spring/json/kafka/OSONSerializer.java similarity index 60% rename from database/starters/oracle-spring-boot-starter-samples/oracle-spring-boot-sample-json-events/src/main/java/com/oracle/database/spring/jsonevents/serde/JSONBSerializer.java rename to database/starters/oracle-spring-boot-json-data-tools/src/main/java/com/oracle/spring/json/kafka/OSONSerializer.java index 4197a65c..3a39f082 100644 --- a/database/starters/oracle-spring-boot-starter-samples/oracle-spring-boot-sample-json-events/src/main/java/com/oracle/database/spring/jsonevents/serde/JSONBSerializer.java +++ b/database/starters/oracle-spring-boot-json-data-tools/src/main/java/com/oracle/spring/json/kafka/OSONSerializer.java @@ -1,18 +1,18 @@ -// Copyright (c) 2024, Oracle and/or its affiliates. +// Copyright (c) 2025, Oracle and/or its affiliates. // Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. -package com.oracle.database.spring.jsonevents.serde; +package com.oracle.spring.json.kafka; import com.oracle.spring.json.jsonb.JSONB; import org.apache.kafka.common.serialization.Serializer; /** - * The JSONBSerializer converts java objects to a JSONB byte array. + * The OSONSerializer converts java objects to a JSONB byte array. * @param serialization type. */ -public class JSONBSerializer implements Serializer { +public class OSONSerializer implements Serializer { private final JSONB jsonb; - public JSONBSerializer(JSONB jsonb) { + public OSONSerializer(JSONB jsonb) { this.jsonb = jsonb; } diff --git a/database/starters/oracle-spring-boot-starter-samples/oracle-spring-boot-sample-json-events/src/main/java/com/oracle/database/spring/jsonevents/OKafkaConfiguration.java b/database/starters/oracle-spring-boot-starter-samples/oracle-spring-boot-sample-json-events/src/main/java/com/oracle/database/spring/jsonevents/OKafkaConfiguration.java index d7e8164b..ce02a721 100644 --- a/database/starters/oracle-spring-boot-starter-samples/oracle-spring-boot-sample-json-events/src/main/java/com/oracle/database/spring/jsonevents/OKafkaConfiguration.java +++ b/database/starters/oracle-spring-boot-starter-samples/oracle-spring-boot-sample-json-events/src/main/java/com/oracle/database/spring/jsonevents/OKafkaConfiguration.java @@ -5,9 +5,7 @@ import java.util.Properties; import com.oracle.database.spring.jsonevents.model.Sensor; -import com.oracle.database.spring.jsonevents.serde.JSONBDeserializer; -import com.oracle.database.spring.jsonevents.serde.JSONBSerializer; -import com.oracle.spring.json.jsonb.JSONB; +import com.oracle.spring.json.kafka.OSONKafkaSerializationFactory; import org.apache.kafka.clients.consumer.Consumer; import org.apache.kafka.clients.producer.Producer; import org.apache.kafka.common.serialization.Deserializer; @@ -26,7 +24,6 @@ */ @Configuration public class OKafkaConfiguration { - private final JSONB jsonb; @Value("${app.ojdbcPath}") private String ojdbcPath; @@ -46,10 +43,6 @@ public class OKafkaConfiguration { @Value("${app.consumerGroup:SensorEvents}") private String consumerGroup; - public OKafkaConfiguration(JSONB jsonb) { - this.jsonb = jsonb; - } - @Bean @Qualifier("okafkaProperties") public Properties okafkaProperties() { @@ -64,7 +57,7 @@ public Properties okafkaProperties() { @Bean @Qualifier("okafkaConsumer") - public Consumer okafkaConsumer() { + public Consumer okafkaConsumer(OSONKafkaSerializationFactory osonKafkaSerializationFactory) { Properties props = okafkaProperties(); props.put("group.id", consumerGroup); props.put("enable.auto.commit","false"); @@ -72,18 +65,18 @@ public Consumer okafkaConsumer() { props.put("auto.offset.reset", "earliest"); Deserializer keyDeserializer = new StringDeserializer(); - Deserializer valueDeserializer = new JSONBDeserializer<>(jsonb, Sensor.class); + Deserializer valueDeserializer = osonKafkaSerializationFactory.createDeserializer(Sensor.class); return new KafkaConsumer<>(props, keyDeserializer, valueDeserializer); } @Bean @Qualifier("okafkaProducer") - public Producer okafkaProducer() { + public Producer okafkaProducer(OSONKafkaSerializationFactory osonKafkaSerializationFactory) { Properties props = okafkaProperties(); props.put("enable.idempotence", "true"); Serializer keySerializer = new StringSerializer(); - Serializer valueSerializer = new JSONBSerializer<>(jsonb); + Serializer valueSerializer = osonKafkaSerializationFactory.createSerializer(); return new KafkaProducer<>(props, keySerializer, valueSerializer); } } From c91a7d5ce5ecb1d6780cf2a3a07977e0365791cb Mon Sep 17 00:00:00 2001 From: Anders Swanson Date: Tue, 20 May 2025 14:01:16 -0700 Subject: [PATCH 2/2] Copyrights Signed-off-by: Anders Swanson --- .../spring-cloud-stream-binder-txeventq-sample/pom.xml | 2 +- .../oracle/spring/json/JsonCollectionsAutoConfiguration.java | 2 +- .../java/com/oracle/spring/json/kafka/OSONDeserializer.java | 2 +- .../oracle/spring/json/kafka/OSONKafkaSerializationFactory.java | 2 +- .../oracle/database/spring/jsonevents/OKafkaConfiguration.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/database/spring-cloud-stream-binder-oracle-txeventq/spring-cloud-stream-binder-txeventq-sample/pom.xml b/database/spring-cloud-stream-binder-oracle-txeventq/spring-cloud-stream-binder-txeventq-sample/pom.xml index 18cc1c1a..1626b6c6 100644 --- a/database/spring-cloud-stream-binder-oracle-txeventq/spring-cloud-stream-binder-txeventq-sample/pom.xml +++ b/database/spring-cloud-stream-binder-oracle-txeventq/spring-cloud-stream-binder-txeventq-sample/pom.xml @@ -1,6 +1,6 @@ - + 4.0.0 com.oracle.database.spring.cloud-stream-binder diff --git a/database/starters/oracle-spring-boot-json-data-tools/src/main/java/com/oracle/spring/json/JsonCollectionsAutoConfiguration.java b/database/starters/oracle-spring-boot-json-data-tools/src/main/java/com/oracle/spring/json/JsonCollectionsAutoConfiguration.java index 43e7f84f..a478a156 100644 --- a/database/starters/oracle-spring-boot-json-data-tools/src/main/java/com/oracle/spring/json/JsonCollectionsAutoConfiguration.java +++ b/database/starters/oracle-spring-boot-json-data-tools/src/main/java/com/oracle/spring/json/JsonCollectionsAutoConfiguration.java @@ -1,4 +1,4 @@ -// Copyright (c) 2024, Oracle and/or its affiliates. +// Copyright (c) 2024, 2025, Oracle and/or its affiliates. // Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. package com.oracle.spring.json; diff --git a/database/starters/oracle-spring-boot-json-data-tools/src/main/java/com/oracle/spring/json/kafka/OSONDeserializer.java b/database/starters/oracle-spring-boot-json-data-tools/src/main/java/com/oracle/spring/json/kafka/OSONDeserializer.java index dd5568a2..aa7caa27 100644 --- a/database/starters/oracle-spring-boot-json-data-tools/src/main/java/com/oracle/spring/json/kafka/OSONDeserializer.java +++ b/database/starters/oracle-spring-boot-json-data-tools/src/main/java/com/oracle/spring/json/kafka/OSONDeserializer.java @@ -1,4 +1,4 @@ -// Copyright (c) 2024, Oracle and/or its affiliates. +// Copyright (c) 2025, Oracle and/or its affiliates. // Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. package com.oracle.spring.json.kafka; diff --git a/database/starters/oracle-spring-boot-json-data-tools/src/main/java/com/oracle/spring/json/kafka/OSONKafkaSerializationFactory.java b/database/starters/oracle-spring-boot-json-data-tools/src/main/java/com/oracle/spring/json/kafka/OSONKafkaSerializationFactory.java index 6e5c81aa..f1ce5c73 100644 --- a/database/starters/oracle-spring-boot-json-data-tools/src/main/java/com/oracle/spring/json/kafka/OSONKafkaSerializationFactory.java +++ b/database/starters/oracle-spring-boot-json-data-tools/src/main/java/com/oracle/spring/json/kafka/OSONKafkaSerializationFactory.java @@ -1,4 +1,4 @@ -// Copyright (c) 2024, Oracle and/or its affiliates. +// Copyright (c) 2025, Oracle and/or its affiliates. // Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. package com.oracle.spring.json.kafka; diff --git a/database/starters/oracle-spring-boot-starter-samples/oracle-spring-boot-sample-json-events/src/main/java/com/oracle/database/spring/jsonevents/OKafkaConfiguration.java b/database/starters/oracle-spring-boot-starter-samples/oracle-spring-boot-sample-json-events/src/main/java/com/oracle/database/spring/jsonevents/OKafkaConfiguration.java index ce02a721..99c9de58 100644 --- a/database/starters/oracle-spring-boot-starter-samples/oracle-spring-boot-sample-json-events/src/main/java/com/oracle/database/spring/jsonevents/OKafkaConfiguration.java +++ b/database/starters/oracle-spring-boot-starter-samples/oracle-spring-boot-sample-json-events/src/main/java/com/oracle/database/spring/jsonevents/OKafkaConfiguration.java @@ -1,4 +1,4 @@ -// Copyright (c) 2024, Oracle and/or its affiliates. +// Copyright (c) 2024, 2025, Oracle and/or its affiliates. // Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. package com.oracle.database.spring.jsonevents;