Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用默认模式注册表客户端而不是Avro模式注册表客户端时,Spring Cloud Stream出现问题_Java_Spring_Apache Kafka_Spring Cloud Stream_Confluent Schema Registry - Fatal编程技术网

Java 使用默认模式注册表客户端而不是Avro模式注册表客户端时,Spring Cloud Stream出现问题

Java 使用默认模式注册表客户端而不是Avro模式注册表客户端时,Spring Cloud Stream出现问题,java,spring,apache-kafka,spring-cloud-stream,confluent-schema-registry,Java,Spring,Apache Kafka,Spring Cloud Stream,Confluent Schema Registry,我们将Kafka与SpringCloudStream一起使用,我们需要连接到SpringBoot组件中的汇合模式注册表,请参阅 我们添加了以下配置来创建所需的ConfluentSchemaRegistryclientbean,请查看哪个应该覆盖SpringCloudStream中的默认模式注册表 但是,在一些部署之后,我们间歇性地看到以下故障 org.springframework.messaging.MessageDeliveryException: failed to send Messag

我们将Kafka与SpringCloudStream一起使用,我们需要连接到SpringBoot组件中的汇合模式注册表,请参阅

我们添加了以下配置来创建所需的ConfluentSchemaRegistryclientbean,请查看哪个应该覆盖SpringCloudStream中的默认模式注册表

但是,在一些部署之后,我们间歇性地看到以下故障

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这一事实向我们表明,我们的汇合SchemaRegistrYCLIENT bean的连接存在问题


在我们的配置中是否还需要其他东西来确保ConfluentSchemaRegistrCyclient bean正确连接?

它对我有效。这就是我所做的:

  • 使用的配置类与您使用的完全相同
  • 在项目中使用了
    @EnableSchemaRegistryClient
    注释
  • 将avro序列化程序添加到类路径:
    io。合流:kafka avro序列化程序
  • 按如下方式设置属性:

    spring.cloud.stream.kafka.bindings.channel.consumer.configuration.schema.registry.url=您的注册表地址 spring.cloud.stream.kafka.bindings.channel.consumer.configuration.specific.avro.reader=true

其中频道对应于应用程序中的频道名称

我认为最后一个属性非常重要,它告诉Spring使用Avro序列化程序而不是默认的序列化程序


我使用的是Spring Cloud Stream Elmhurst.RELEASE,因此如果使用其他版本,属性的名称可能会略有不同。

我现在已将@EnableSchemaRegistryClient注释移动到项目应用程序类see并重新部署,这修复了我在我们的环境中部署它时遇到的问题

我一直在用@EnableSchemaRegistryClient注释我的生产者和消费者类

在我所有的本地测试中,这都是针对我的本地docker confluent模式注册表进行的。 然而,在部署到我们的环境中时,它大部分时间都在工作,但在一些部署之后偶尔会失败

我没有成功地在本地复制这个

我还注意到,在本地测试中,如果删除合流模式注册表的配置,我会得到相同的空指针异常堆栈跟踪

因此,我认为我看到的问题是,当项目应用程序类中不存在@enableSchemareRegistryClient注释时,AvroschemareRegistryClientMessageConverter bean没有与汇合模式注册表bean连接


我不明白为什么这样做是必要的,但我认为这可能已经解决了问题。

如果您发布一个项目(在Github或其他地方),并使用最少的配置来重现问题,这会有所帮助。虽然NPE闻起来确实像是我们这边的一个bug,但很难猜测到底是哪里出了问题。下面是一个工作示例,展示了spring云流应用程序如何连接到合流模式注册表。您能比较一下注释,看看您的配置中缺少什么吗?