我使用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。)
你将如何完成任务? 谢谢
答案 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/common和confluentinc/rest-utils构建master
分支。 1}},然后是带有mvn install
)的模式注册表项目,或者例如将类复制粘贴到您自己的代码项目中。
注意:上面和下面项目中的
mvn install
分支是开发分支,即预发布分支。这个答案的未来读者应该记住这一点。
我们还举例说明了如何使用新的即将推出的Confluent Avro serde。您可以在https://github.com/confluentinc/examples的master
分支中找到演示。
Confluent提供的与Avro相关的示例和端到端集成测试的一些直接链接(除了下面的示例之外还有更多这样的示例):
master
分支)master
分支)master
分支)答案 1 :(得分:0)
好的,我想我做到了。我按照这个例子
我使用了生成GenericRecord对象的GenericAvroSerde类,然后我可以使用它。
我希望这对其他人有用。