如何使用avro&发送对象列表卡夫卡

时间:2016-12-15 16:26:58

标签: java apache-kafka avro

我正在尝试使用Avro&amp ;;发送一个对象列表Kafka,我的主要问题是我的列表大小可能会经常更改,因此我不知道如何构建动态Avro架构,因为据我所知,Avro架构意味着众所周知的结构。

有人知道怎么做吗?

1 个答案:

答案 0 :(得分:0)

我认为最简单的方法是 用列表创建一个类, 例如:

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