我正在尝试使用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);
但它不起作用。这可能是由于两件事。
该消息是avro对象的列表。但我正在尝试使用Avro架构创建datamReader。但我尝试创建Schema.createArray(UserDTO.class)之类的架构。但它不起作用。
我认为avro消息的预期内容类型是application / avro,但是当消息由s-c-s生成时,它是contentType=application/x-java-object;
我正在尝试通过实现org.apache.kafka.common.serialization.Deserializer
来构建反序列化器并构造KafkaConsumerFactory
。有人可以帮忙吗?
答案 0 :(得分:1)
请参阅Producer Properties中显示的属性...producer.useNativeEncoding
。
<强> useNativeEncoding 强>
设置为true时,出站消息由客户端库直接序列化,必须相应地进行配置(例如,设置适当的Kafka生产者值序列化程序)。使用此配置时,出站邮件编组不基于绑定的contentType。当使用本机编码时,消费者有责任使用适当的解码器(例如:Kafka消费者值反序列化器)来反序列化入站消息。此外,使用本机编码/解码时,将忽略headerMode属性,并且不会将标头嵌入到消息中。
默认值:false。