Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为GenericData.Record编写KafkaAvro Serde_Java_Apache Kafka_Avro_Kafka Consumer Api_Apache Kafka Streams - Fatal编程技术网

Java 如何为GenericData.Record编写KafkaAvro Serde

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

我使用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.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)