我有一个基于C ++的遗留系统,它会发出二进制编码的Avro数据,支持融合的Avro架构注册表格式。在我的Java应用程序中,我使用KafkaAvroDeserializer类成功地反序列化了该消息,但无法打印出该消息。
private void consumeAvroData(){
String group = "group1";
Properties props = new Properties();
props.put("bootstrap.servers", "http://1.2.3.4:9092");
props.put("group.id", group);
props.put("enable.auto.commit", "true");
props.put("auto.commit.interval.ms", "1000");
props.put("session.timeout.ms", "30000");
props.put("key.deserializer", LongDeserializer.class.getName());
props.put("value.deserializer", KafkaAvroDeserializer.class.getName());
// props.put(KafkaAvroDeserializerConfig.SPECIFIC_AVRO_READER_CONFIG,"false");
props.put("schema.registry.url","http://1.2.3.4:8081");
KafkaConsumer<String, GenericRecord> consumer = new KafkaConsumer<String, GenericRecord>(props);
consumer.subscribe(Arrays.asList(TOPIC_NAME));
System.out.println("Subscribed to topic " + TOPIC_NAME);
while (true) {
ConsumerRecords<String, GenericRecord> records = consumer.poll(100);
for (ConsumerRecord<String, GenericRecord> record : records)
{
System.out.printf("value = %s\n",record.value());
}
}
}
我得到的输出是
{"value":"�"}
为什么我无法打印反序列化的数据?任何帮助赞赏!
答案 0 :(得分:2)
Confluent Avro Serializer的电线格式在标题为&#34;电线格式&#34;
的部分中有说明。http://docs.confluent.io/current/schema-registry/docs/serializer-formatter.html
它是一个单个魔术字节(当前总是0),后面是Schema Registry返回的4字节模式ID,后跟一组字节,它们是Avro二进制编码中的Avro序列化数据。
如果您将消息作为ByteArray读取并打印出前5个字节,您将知道这是否真的是Confluent Avro序列化消息。应为0,后跟0001或其他一些模式ID,您可以检查它是否在此主题的模式注册表中。
如果它不是这种格式,那么消息可能是另一种方式序列化(没有Confluent Schema Registry),你需要使用不同的反序列化器或者从消息值中提取完整的Schema,甚至需要获取来自其他一些来源的原始Schema文件能够解码。