【问题标题】:How to send a list of objects using avro & kafka如何使用 avro 和 kafka 发送对象列表
【发布时间】:2016-12-15 16:26:57
【问题描述】:
我正在尝试使用 Avro 和 Kafka 发送对象列表,我的主要问题是我的列表大小可能会经常更改,所以我不知道如何构建动态 Avro 架构,因为据我了解 Avro架构适用于众所周知的结构。
有人知道怎么做吗?
【问题讨论】:
标签:
java
apache-kafka
avro
【解决方案1】:
我认为最简单的方法是
用列表创建一个类,
例如:
public class AvroObj {
private List<TestObj> list;
public List<TestObj> getList() {
return list;
}
public void setList(List<TestObj> list) {
this.list = list;
}
}
创建架构:
Schema schema = ReflectData.get().getSchema(AvroObj.class);
使用 ReflectDatumWriter 将其序列化为字节(我将其提供给其他数据写入器,因为您可能会捕获 ClassCastException)
try(ByteArrayOutputStream out = new ByteArrayOutputStream()) {
BinaryEncoder encoder = EncoderFactory.get().binaryEncoder(out, null);
DatumWriter<AvroObj> writer = new ReflectDatumWriter<>(schema);
writer.write(avroObj, encoder);
encoder.flush();
byte[] bytes = out.toByteArray();
}
然后用 kafka producer 发送字节。
反序列化消费者收到的字节:
DatumReader<AvroObj> reader1 = new ReflectDatumReader<AvroObj>(schema);
Decoder decoder = DecoderFactory.get().binaryDecoder(bytes, null);
AvroObj decodedAvroObj = reader1.read(null, decoder);