无法将Avro特定记录反序列化为Spring Cloud Stream中的通用记录

时间:2019-08-21 08:28:46

标签: apache-kafka avro spring-kafka spring-cloud-stream confluent-schema-registry

我希望有一个使用Spring Cloud Stream的通用使用者,不需要在编译时专门指定Avro消息的架构。由于消息中包含模式ID,因此应该可以使用模式ID将其反序列化为对象或通用记录(这可以在Spring Cloud Stream框架之外轻松完成)。为此,我尝试使用与具有特定记录的Spring Cloud Stream应用程序相同的方法。显然,这种方法行不通,因为我需要在使用时指定记录类型。它将引发以下异常:

Caused by: org.apache.kafka.common.errors.SerializationException: Could not find class com.example.avro.model.InputModel specified in writer's schema whilst finding reader's schema for a SpecificRecord.

我想知道是否有一种方法可以在编译时不了解架构(和消息类型)地使用主题中的消息。

一小段消费者:

@StreamListener(Processor.INPUT)
public void handleMessage(Object message) {
...
}

P.S:我将io.confluent.kafka.serializers.KafkaAvroDeserializer用于值反序列化器。

2 个答案:

答案 0 :(得分:0)

我可以通过设置spring.kafka.properties.specific.avro.reader= false并为处理程序使用以下方法签名来解决此问题:

@StreamListener(Processor.INPUT)
public void handleMessage(GenericRecord record) {
...
}

答案 1 :(得分:0)

我见过类似的情况,在我的yml中,指定了 KafkaAvroDeserializer

consumer-properties:
        key.deserializer:org.apache.kafka.common.serialization.StringDeserializer
        value.deserializer: io.confluent.kafka.serializers.KafkaAvroDeserializer

然后在应用程序中

@ServiceActivator(inputChannel = Processor.INPUT, outputChannel = Processor.OUTPUT)
    public void hand(Object payload) throws IOException {
        GenericRecord record = (GenericRecord) payload;

}