我不断将Avro格式的数据发送到名为“ SD_RTL”的主题。可以通过符合自定义Avro模式的Confluent数据源来生成此数据。
在此主题上使用kafka-avro-console-consumer时,我可以正确看到数据。这是一个正确接收元组的示例:
{"_id":1276215,"serialno":"0","timestamp":416481,"locationid":"Location_0","gpscoords":{"latitude":-2.9789479087622794,"longitude":-4.344459940322691},"data":{"tag1":0,"tag2":1}}
当我尝试通过Java应用程序使用此数据时出现问题。我收到错误“未知的魔术字节”。
我正在使用受confluent's website中“序列化器”部分下第二个代码段启发的代码。
这是我的代码:
//consumer properties
Properties props = new Properties();
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
props.put(ConsumerConfig.GROUP_ID_CONFIG, "group1");
//string inputs and outputs
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer");
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "io.confluent.kafka.serializers.KafkaAvroDeserializer");
props.put("schema.registry.url", "localhost:8081");
props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
//subscribe to topic
String topic = "SD_RTL";
final Consumer<String, SensorsPayload> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Arrays.asList(topic));
try {
while (true) {
ConsumerRecords<String, SensorsPayload> records = consumer.poll(100);
for (ConsumerRecord<String, SensorsPayload> record : records) {
System.out.printf("offset = %d, key = %s, value = %s \n", record.offset(), record.key(), record.value());
}
}
} finally {
consumer.close();
}
我的代码和汇合的代码有些不同。例如,Confluent使用以下行:
final Consumer<String, GenericRecord> consumer = new KafkaConsumer<String, String>(props);
如果我将正确的部分设为<String, String>
而不是<String, SensorsPayload>
,则IntelliJ会抱怨类型不兼容。我不确定是否与我的问题有关。
我已经通过avro-maven-plugin从Avro模式自动生成了SensorsPayload类。
当kafka的avro控制台使用方未出现时,为什么我的使用方应用程序会生成“未知魔术字节”错误?