簡體   English   中英

找不到 Spring kafka AVRO 生成的類

[英]Spring kafka AVRO generated class not found

我正在使用融合 JDBC 連接器連接到 postgres 數據庫以檢索更改並將它們放入 kafka 主題中。 現在我想使用 Spring Boot 消費者來使用這些消息。 這些消息采用 AVRO 格式。 我有來自連接器的模式,並使用 avro maven 插件為它生成了一個 POJO 類。

但是當監聽器啟動時只有以下錯誤

   java.lang.IllegalStateException: This error handler cannot process 'SerializationException's directly; please consider configuring an 'ErrorHandlingDeserializer' in the value and/or key deserializer
       at org.springframework.kafka.listener.SeekUtils.seekOrRecover(SeekUtils.java:194) ~[spring-kafka-2.7.2.jar:2.7.2]
       at org.springframework.kafka.listener.SeekToCurrentErrorHandler.handle(SeekToCurrentErrorHandler.java:112) ~[spring-kafka-2.7.2.jar:2.7.2]
       at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.handleConsumerException(KafkaMessageListenerContainer.java:1598) ~[spring-kafka-2.7.2.jar:2.7.2]
       at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.run(KafkaMessageListenerContainer.java:1210) ~[spring-kafka-2.7.2.jar:2.7.2]
       at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) ~[na:na]
       at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na]
       at java.base/java.lang.Thread.run(Thread.java:832) ~[na:na]
   Caused by: org.apache.kafka.common.errors.SerializationException: Error deserializing key/value for partition ps_git_repo-0 at offset 0. If needed, please seek past the record to continue consumption.
   Caused by: org.apache.kafka.common.errors.SerializationException: Could not find class ps_git_repo specified in writer's schema whilst finding reader's schema for a SpecificRecord.

當我不使用 avro 反序列化數據時,我將收到數據但不可讀。

在 pom.xml 我有以下依賴項


    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.kafka</groupId>
        <artifactId>spring-kafka</artifactId>
    </dependency>
    
    <dependency>
        <groupId>org.apache.avro</groupId>
        <artifactId>avro</artifactId>
        <version>1.10.2</version>
    </dependency>
    <dependency>
        <groupId>io.confluent</groupId>
        <artifactId>kafka-avro-serializer</artifactId>
        <version>6.2.0</version>
        <exclusions>
            <exclusion>
                <artifactId>netty</artifactId>
                <groupId>io.netty</groupId>
            </exclusion>
        </exclusions>
    </dependency>

在 application.properties 中,我添加了反序列化器和模式注冊表 url。


    spring.kafka.consumer.key-deserializer = org.apache.kafka.common.serialization.StringDeserializer
    spring.kafka.consumer.value-deserializer = io.confluent.kafka.serializers.KafkaAvroDeserializer
    spring.kafka.bootstrap-servers = http://localhost:9092
    spring.kafka.consumer.properties.specific.avro.reader = true
    spring.kafka.consumer.properties.schema.registry.url = http://localhost:8081

在構建中,我使用 avro maven 插件從連接器創建的模式生成 POJO。

pom.xml 中的插件


    <plugin>
        <groupId>org.apache.avro</groupId>
        <artifactId>avro-maven-plugin</artifactId>
        <version>1.10.2</version>
        <executions>
            <execution>
                <phase>generate-sources</phase>
                <goals>
                    <goal>schema</goal>
                </goals>
                <configuration>
                    <sourceDirectory>${project.basedir}/src/main/avro/</sourceDirectory>
                    <outputDirectory>${project.basedir}/src/main/java/</outputDirectory>
                    <stringType>String</stringType>
                </configuration>
            </execution>
        </executions>
    </plugin>

我已將以下架構放入文件夾並使用mvn generate-sources生成到 pojo

架構.avsc


    {
      "connect.name": "ps_git_repo",
      "fields": [
        {
          "name": "id",
          "type": "long"
        },
        {
          "default": null,
          "name": "name",
          "type": [
            "null",
            "string"
          ]
        }
      ],
      "name": "ps_git_repo",
      "namespace": "com.company.api.kafkademo",
      "type": "record"
    }

我得到了正確的 ps_git_repo.java 類,然后我有這個監聽器來檢索消息。

    @SpringBootApplication
    @EnableKafka
    public class KafkaDemoApplication {
    
        @KafkaListener(groupId = "test123", topics = "ps_git_repo_test")
        public void handleMessage(ps_git_repo message) {
            System.out.println(message);
        }
    
        public static void main(String[] args) {
            SpringApplication.run(KafkaDemoApplication.class, args);
        }
    
    }

找不到架構。

有人知道出了什么問題嗎?

反序列化器使用 connect.name 字段而不是命名空間來查找正確的類。

我在 JDBC_connector 的配置中添加了以下幾行,以讓連接器生成正確的命名空間

"transforms":"AddNamespace",
"transforms.AddNamespace.type":"org.apache.kafka.connect.transforms.SetSchemaMetadata$Value",
"transforms.AddNamespace.schema.name": "com.company.api.kafkademo.ps_git_repo"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM