如何为GenericData.Record编写KafkaAvro Serde

时间:2017-04-27 09:21:52

标签: java apache-kafka avro kafka-consumer-api apache-kafka-streams

我使用Kafka 0.10.2和Avro来序列化我的消息,包括密钥和值数据。 现在我想使用Kafka Streams,但我仍然试图为Serde类编写GenericData.Record类。

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();
    }

}

这是我在注释行中的错误

Type mismatch: cannot convert from Serde<Object> to Serde<GenericData.Record>

我需要为GenericData.Record定义Serde类(而不是我的特定POJO)因为我可以在同一个通道上有不同的对象结构,所以反序列化器应该返回{{1} (并且我将在此步骤之后填充正确的POJO。)

你将如何完成任务? 谢谢

2 个答案:

答案 0 :(得分:2)

您已经问过question in the Confluent mailing list。以下是我在那里发布的答案摘要。

我们刚刚完成了针对Kafka Streams的官方Confluent Avro serde(特定Avro +通用Avro)的工作。请参阅https://github.com/confluentinc/schema-registry/tree/master/avro-serde

新的Avro serde,即Confluent模式注册表识别/兼容,将在即将推出的Confluent 3.3中发布,这将持续数周。

在发布3.3之前,您可以从master分支构建自己的工件(必须首先使用{{confluentinc/commonconfluentinc/rest-utils构建master分支。 1}},然后是带有mvn install)的模式注册表项目,或者例如将类复制粘贴到您自己的代码项目中。

  

注意:上面和下面项目中的mvn install分支是开发分支,即预发布分支。这个答案的未来读者应该记住这一点。

我们还举例说明了如何使用新的即将推出的Confluent Avro serde。您可以在https://github.com/confluentinc/examplesmaster分支中找到演示。

Confluent提供的与Avro相关的示例和端到端集成测试的一些直接链接(除了下面的示例之外还有更多这样的示例):

答案 1 :(得分:0)

好的,我想我做到了。我按照这个例子

https://github.com/JohnReedLOL/kafka-streams/blob/master/src/main/java/io/confluent/examples/streams/TopArticlesLambdaExample.java

我使用了生成GenericRecord对象的GenericAvroSerde类,然后我可以使用它。

我希望这对其他人有用。