为什么在用我的应用程序反序列化此Avro架构而不是使用kafka-avro-console-consumer反序列化时会出现“未知的魔术字节”错误?

时间:2019-08-02 09:12:25

标签: java apache-kafka avro confluent

我不断将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控制台使用方未出现时,为什么我的使用方应用程序会生成“未知魔术字节”错误?

0 个答案:

没有答案