消费者使用spring-cloud-stream-kafka-binder生产的spring-kafka的avro消息

时间:2017-09-28 09:28:10

标签: avro kafka-consumer-api spring-cloud-stream spring-kafka

我正在尝试使用ConsumerSeekAware读取kafka主题中的最后一条消息.Message类型是Avro对象列表。我能够成功地做到这一点。但是在反序列化期间它失败了。 该消息是使用spring-cloud-stream-kafka框架生成的。邮件的内容类型为contentType=application/x-java-object;type=java.util.ArrayList

我知道avro消息可以反序列化,如下所示。

 DatumReader<GenericRecord> datumReader =
            new SpecificDatumReader<>(targetType.newInstance().getSchema());
        Decoder decoder = DecoderFactory.get().binaryDecoder(data, null);

        result = (T) datumReader.read(null, decoder);

但它不起作用。这可能是由于两件事。

  1. 该消息是avro对象的列表。但我正在尝试使用Avro架构创建datamReader。但我尝试创建Schema.createArray(UserDTO.class)之类的架构。但它不起作用。

  2. 我认为avro消息的预期内容类型是application / avro,但是当消息由s-c-s生成时,它是contentType=application/x-java-object;

  3. 我正在尝试通过实现org.apache.kafka.common.serialization.Deserializer来构建反序列化器并构造KafkaConsumerFactory。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

请参阅Producer Properties中显示的属性...producer.useNativeEncoding

  

<强> useNativeEncoding

     

设置为true时,出站消息由客户端库直接序列化,必须相应地进行配置(例如,设置适当的Kafka生产者值序列化程序)。使用此配置时,出站邮件编组不基于绑定的contentType。当使用本机编码时,消费者有责任使用适当的解码器(例如:Kafka消费者值反序列化器)来反序列化入站消息。此外,使用本机编码/解码时,将忽略headerMode属性,并且不会将标头嵌入到消息中。

     

默认值:false。