使用kafka将Java转换为Avro并返回

时间:2016-04-26 00:59:57

标签: java apache-kafka avro

我使用汇合平台0.9.0.1和kafka-avro-serializer 2.0.1。尝试将事件发送到kafka并将其读回来,我不知道如何将事件转换回Java对象。我已经阅读了avro和汇合文档,并且提示这是可行的,但我无法找到一个好的例子。这是我的代码,当我用KafkaConsumer读取它时,我得到一个GenericData $ Record,我的问题是如何将它重新变成Java pojo。我找到了用于序列化对象的bit代码。

这是我的代码:

postIssue: function (issue) {
    return getUserConfiguration()
    .then(function (response) {
        var headers = response.headers;
        var token = headers("X-XSRF-TOKEN");
        if (token) {
            _cookie = token;
            if (issue.isValid()) {
                var url = _baseURL + "/api/issue/";
                var data = JSON.stringify(issue);
                var config = {
                    xhrFields: { withCredentials: true },
                    headers: { "X-XSRF-TOKEN": _cookie }
                };
                return $http.post(url, data, config);
            }
            else {
                return $q.reject("Issue doesn't have valid fields to submit");
            }
        }
        else {
            return $q.reject("There is no XSRF token on response header");
        }
    }, function (error) {
        return $q.reject("Error getting user's configuration");
    });
}

2 个答案:

答案 0 :(得分:2)

我从不使用Avro,但是看https://avro.apache.org/docs/1.7.6/api/java/org/apache/avro/generic/GenericRecord.html为什么你不能手动填充你的POJO ......

class MyPojo {
    public int v1;
    public String v2;
}

// copied from your example code
ConsumerRecords<String, GenericRecord> records = kafkaConsumer.poll(1000);
for (ConsumerRecord<String, GenericRecord> record1 : records) {
    GenericRecord avroRecord = record1.value();
    MyPojo pojo = new MyPojo();
    pojo.v1 = (Integer)avroRecord.get("<fieldname1>");
    pojo.v2 = (String)avroRecord.get("<fieldname2>");

    // process current pojo
}

不确定这是否有意义。如果这样做,我会将其移动到构造函数MyPojo(GenericRecord)

答案 1 :(得分:0)

就像手动将数据从GenericRecord序列化程序中拉出到Java类中一样...为什么在可以拥有反射库的情况下手动编写数据呢?

要自动转换为已注册的Java类型,您将要查看创建自己的KafkaAvroDeserializer,它会创建一个通过ReflectDatumReader创建的SpecificRecord,如本stackoverflow文章中所列... -KafkaAvroDeserializer does not return SpecificRecord but returns GenericRecord