[英]Unable to deserialize Avro message using Confluent Schema Registry and Spring Cloud Stream
[英]Issue with Spring Cloud Stream using the Default Schema Registry client instead of the Avro Schema Registry client
我們正在將Kafka與Spring Cloud Stream一起使用,並且需要在Spring Boot組件中連接到Confluent Schema Registry,請參閱https://github.com/donalthurley/KafkaConsumeScsAndConfluent 。
我們添加了以下配置來創建所需的ConfluentSchemaRegistryClient bean,請參見https://github.com/donalthurley/KafkaConsumeScsAndConfluent/blob/master/src/main/java/com/example/kafka/KafkaConfig.java ,該配置應覆蓋默認模式Spring Cloud Stream中的注冊表。
但是,在某些部署后,我們間歇性地看到以下故障。
org.springframework.messaging.MessageDeliveryException: failed to send Message to channel
根本原因顯示此堆棧跟蹤
Caused by: java.lang.NullPointerException
at org.springframework.cloud.stream.schema.client.DefaultSchemaRegistryClient.register(DefaultSchemaRegistryClient.java:71)
at org.springframework.cloud.stream.schema.avro.AvroSchemaRegistryClientMessageConverter.resolveSchemaForWriting(AvroSchemaRegistryClientMessageConverter.java:238)
at org.springframework.cloud.stream.schema.avro.AbstractAvroMessageConverter.convertToInternal(AbstractAvroMessageConverter.java:179)
at org.springframework.messaging.converter.AbstractMessageConverter.toMessage(AbstractMessageConverter.java:201)
at org.springframework.messaging.converter.AbstractMessageConverter.toMessage(AbstractMessageConverter.java:191)
at org.springframework.messaging.converter.CompositeMessageConverter.toMessage(CompositeMessageConverter.java:83)
at org.springframework.cloud.stream.binding.MessageConverterConfigurer$OutboundContentTypeConvertingInterceptor.doPreSend(MessageConverterConfigurer.java:322)
at org.springframework.cloud.stream.binding.MessageConverterConfigurer$AbstractContentTypeInterceptor.preSend(MessageConverterConfigurer.java:351)
at org.springframework.integration.channel.AbstractMessageChannel$ChannelInterceptorList.preSend(AbstractMessageChannel.java:611)
at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:453)
AvroSchemaRegistryClientMessageConverter調用DefaultSchemaRegistryClient的事實將向我們表明ConfluentSchemaRegistryClient bean的接線存在問題。
為了確保ConfluentSchemaRegistryClient bean正確連接,我們的配置中還需要其他一些東西嗎?
它為我工作。 這就是我所做的:
@EnableSchemaRegistryClient
批注 io.confluent:kafka-avro-serializer
設置屬性如下:
spring.cloud.stream.kafka.bindings.channel.consumer.configuration.schema.registry.url =您的注冊表地址spring.cloud.stream.kafka.bindings.channel.consumer.configuration.specific.avro.reader = true
其中channel對應於您應用中的頻道名稱。
我認為最后一個屬性對於告訴Spring使用Avro序列化器而不是默認序列化器非常重要。
我正在使用Spring Cloud Stream Elmhurst.RELEASE,因此如果您使用其他版本,則屬性的名稱可能會略有不同。
現在,我已將@EnableSchemaRegistryClient注釋移至項目應用程序類,請參見https://github.com/donalthurley/KafkaConsumeScsAndConfluent/commit/b4cf5427d7ab0a4fed619fe54b042890f5ccb594並重新部署,這已解決了將其部署到環境中時遇到的問題。
我一直在使用@EnableSchemaRegistryClient注釋對生產者和消費者類進行注釋。
在我所有的本地測試中,這一直與我的本地docker confluent模式注冊表相對應。 但是,在部署到我們的環境中時,它大部分時間都可以正常工作,但是在某些部署后偶爾會失敗。
我沒有在本地復制此文件。
我在本地測試中也注意到,如果刪除Confluent Schema Registry的配置,則會得到相同的空指針異常堆棧跟蹤。
所以我想我看到的問題是,當項目應用程序類中不存在@EnableSchemaRegistryClient批注時,AvroSchemaRegistryClientMessageConverter Bean未與融合的架構注冊表Bean關聯。
我不明白為什么確實需要這樣做,但我認為這可能已經解決了問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.