![](/img/trans.png)
[英]How to set multiple consumers in the same topic in Kafka using Quarkus
[英]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.