繁体   English   中英

Kafka、Quarkus 和 Avro 同一主题中的几种事件类型

[英]Several Event Types in the Same Topic With Kafka, Quarkus and Avro

我正在尝试使用 Quarkus 从主题中读取事件。 主题可以包含不同类型的事件。 所有事件都使用 AVRO 格式,所以我有一个架构注册表,我可以在其中读取事件的相关架构。 我使用 avro-maven-plugin 将模式编译为 Java 类。

假设我们有两种具有以下模式的事件:

事件1

{
   "field1": "string"
}

事件2

{
   "field2": "string"
}

在我的申请中,我只对其中之一感兴趣。

 public class Consumer {

    @Incoming("test-in")
    public CompletionStage<Void> read(
        IncomingKafkaRecord<String, Event1> data) {
        System.out.println(data.getKey());
        System.out.println(data.getPayload());
        return data.ack();
    }
}

此代码打印所有事件,而不仅仅是我预期的Event1类型的事件。

当我尝试从事件data.getField1()获取数据时,我得到一个CastException

java.lang.ClassCastException: class org.apache.avro.generic.GenericData$Record cannot be cast to class com.test.Event1 (org.apache.avro.generic.GenericData$Record is in unnamed module of loader io.quarkus.bootstrap.classloading.QuarkusClassLoader @1aa7ecca; com.test.Event1 is in unnamed module of loader io.quarkus.bootstrap.classloading.QuarkusClassLoader @1144a55a)

有一种方法可以使用 AVRO 从具有多种事件类型的主题中仅读取某些事件类型吗?

一个可能的解决方案(有点冗长)是使用SpecificRecord作为有效负载类型,并在应用程序配置文件上为传入事件设置specific.avro.reader=true

 public class Consumer {

    @Incoming("test-in")
    public CompletionStage<Void> read(
        IncomingKafkaRecord<String, SpecificRecord> data) {
            String schemaFullName = data.getPayload().getSchema().getFullName();
            if (schemaFullName.equals(Event1.class.getName())) {
                System.out.println(((Event1) data.getPayload()).getField1());
            }
        return data.ack();
    }
}

选择事件后,您可以将SpecificRecord转换为正确编译的 Avro 事件类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM