簡體   English   中英

使用默認架構注冊表客戶端而不是Avro架構注冊表客戶端的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批注
  • 將avro序列化器添加到類路徑中: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM