Java 如何为GenericData.Record编写KafkaAvro Serde
我使用Kafka 0.10.2和Avro对消息进行序列化,包括密钥和值数据。 现在我想使用Kafka Streams,但我一直在尝试为Java 如何为GenericData.Record编写KafkaAvro Serde,java,apache-kafka,avro,kafka-consumer-api,apache-kafka-streams,Java,Apache Kafka,Avro,Kafka Consumer Api,Apache Kafka Streams,我使用Kafka 0.10.2和Avro对消息进行序列化,包括密钥和值数据。 现在我想使用Kafka Streams,但我一直在尝试为GenericData.Record类编写Serde类 import org.apache.avro.generic.GenericData.Record; import io.confluent.kafka.schemaregistry.client.SchemaRegistryClient; import io.confluent.kafka.serializ
GenericData.Record
类编写Serde
类
import org.apache.avro.generic.GenericData.Record;
import io.confluent.kafka.schemaregistry.client.SchemaRegistryClient;
import io.confluent.kafka.serializers.KafkaAvroDeserializer;
import io.confluent.kafka.serializers.KafkaAvroSerializer;
[...]
public final class KafkaAvroSerde implements Serde<Record> {
private final Serde<Record> inner;
public KafkaAvroSerde() {
// Here I get the error
inner = Serdes.serdeFrom(new KafkaAvroSerializer(), new KafkaAvroDeserializer());
}
public KafkaAvroSerde(SchemaRegistryClient client) {
this(client, Collections.emptyMap());
}
public KafkaAvroSerde(SchemaRegistryClient client, Map<String, ?> props) {
// Here I get the error
inner = Serdes.serdeFrom(new KafkaAvroSerializer(client, props), new KafkaAvroDeserializer(client, props));
}
@Override
public Serializer<Record> serializer() {
return inner.serializer();
}
@Override
public Deserializer<Record> deserializer() {
return inner.deserializer();
}
@Override
public void configure(Map<String, ?> configs, boolean isKey) {
inner.serializer().configure(configs, isKey);
inner.deserializer().configure(configs, isKey);
}
@Override
public void close() {
inner.serializer().close();
inner.deserializer().close();
}
}
import org.apache.avro.generic.GenericData.Record;
导入io.confluent.kafka.schemaregistry.client.SchemaRegistrCyclient;
导入io.confluent.kafka.Serializer.KafkaAvroDeserializer;
导入io.confluent.kafka.Serializer.KafkaAvroSerializer;
[...]
公共最终类KafkaAvroSerde实现Serde{
私人终审法院;
公共卡夫卡夫罗塞德(){
//这里我得到了错误
inner=Serdes.serdeFrom(新的KafkaAvroSerializer(),新的KafkaAvroSerializer());
}
公共KafkaAvroSerde(SchemaRegistrCyclient客户端){
这是(客户端,Collections.emptyMap());
}
公共KafkaAvroSerde(SchemaRegistrCyclient客户端,地图道具){
//这里我得到了错误
内部=Serdes.serdeFrom(新卡夫卡夫罗塞利泽(客户端,道具),新卡夫卡夫罗塞利泽(客户端,道具));
}
@凌驾
公共序列化程序序列化程序(){
返回inner.serializer();
}
@凌驾
公共反序列化程序反序列化程序(){
返回内部.deserializer();
}
@凌驾
公共无效配置(映射配置、布尔isKey){
internal.serializer().configure(configs,isKey);
internal.deserializer().configure(configs,isKey);
}
@凌驾
公众假期结束(){
internal.serializer().close();
内部.deserializer().close();
}
}
这就是我在注释行中遇到的错误
Type mismatch: cannot convert from Serde<Object> to Serde<GenericData.Record>
类型不匹配:无法从Serde转换为Serde
我需要为GenericData.Record
(而不是我的特定POJO)定义Serde类,因为我可以在同一个通道上有不同的对象结构,所以反序列化程序应该返回GenericData
(在这一步之后我将填充正确的POJO)
你会怎么做?
谢谢你好的,我想是的。我遵循这个例子 我使用了GenericAvroSerde类,该类生成GenericRecord对象,然后我就可以使用它了 我希望这对其他人有用。你已经问过了。这是我在那里发布的答案摘要 我们刚刚完成了卡夫卡流的官方合流Avro serde(特定Avro+通用Avro)的工作。看 新的Avro-serde是Confluent schema registry感知/兼容的,将与即将发布的Confluent 3.3一起发布,该版本将在几周后发布 在3.3发布之前,您可以从
master
分支构建您自己的工件(您必须首先使用mvn install
构建和的master
分支,然后使用mvn install
构建模式注册表项目),或者例如,将类复制粘贴到您自己的代码项目中
注:上面和下面项目中的主分支是开发分支,即预发布分支。这个答案的未来读者应该记住这一点
我们也有关于如何使用新的即将推出的Confluent Avro serde的示例。您可以在的master
分支中找到演示
Confluent提供的Avro相关示例和端到端集成测试的一些直接链接(此类示例比下面的示例更多):
- (
master
branch)
- (
master
branch)
- (
master
branch)