当前位置: 首页 > 知识库问答 >
问题:

带有Avro的Spring Cloud Stream无法正确转换字符串消息

柯默
2023-03-14

我有一个问题,源发送GenericMessage[payload=xxxxx,...]而接收器接收消息作为10,120,120,120,120,120。

这个问题发生在我设置Avro消息转换器之后。如果我删除Avro消息转换器并使用StreamListener来处理消息转换,它会正常工作。

应用程序。属性

spring.cloud.stream.bindings.toGreeting.destination=greeting
spring.cloud.stream.bindings.toGreeting.contentType=application/*+avro
spring.cloud.stream.schema.avro.dynamicSchemaGenerationEnabled=true

水槽应用

server.port=8990 
spring.cloud.stream.bindings.greeting.destination=greeting

消息转换器

@Configuration
@EnableSchemaRegistryClient
public class MessageConverterConfig {
    @Bean
    public MessageConverter topic1MessageConverter() throws IOException {
        return new AvroSchemaMessageConverter(MimeType.valueOf("avro/bytes"));
    }
}

应用程序类

@SpringBootApplication
@EnableSchemaRegistryClient
public class SourceApplication {
    public static void main(String[] args) {
        SpringApplication.run(SourceApplication.class, args);
    }
}

@EnableSchemaRegistryServer
@EnableSchemaRegistryClient
@SpringBootApplication
public class SinkApplication {
    public static void main(String[] args) {
        SpringApplication.run(SinkApplication.class, args);
    }
}

我是否缺少配置?谢谢

共有2个答案

裴兴学
2023-03-14

如果您正在设置spring.cloud.stream.bindings.toGreeting.contentType=Application/*avro,则需要使用AvroSchemaRegstryClientMessageConverter(由SCSt配置),并且您不必为MimeTypeavro/bytes设置显式转换器topic1MessageConverter

如果要使用此转换器,则需要设置spring。云流动绑定。toGreeting。contentType=avro/字节

禄星腾
2023-03-14

这里有一条简单的规则:

如果您只想拥有一个可以从avro序列化/反序列化的消息转换器,并且您可以在配置GenericRecords期间提供架构位置,或者您的StreamListener方法具有SpecificRecord类型的签名。然后选择AvroSchemaMessageConverter,像设置一样进行设置,但使用avro/bytes。我们保留应用程序/*avro以支持模式演化。

因此,如果您设置了EnableSchemaRegistryClient,那么您将委托给外部注册表来拥有您的模式。在这种情况下,不仅需要注册表,还需要在那里注册的模式。

默认情况下,如果是spring,生产者将自动注册SpecificRecord/GenericRecord或POJO类型的任何有效负载。云流动架构。阿夫罗。已启用dynamicSchemaGenerationEnabled。

在这种情况下,生产者实际上会将头设置为类似于应用程序/vnd的内容。使用者v1 avro假设你的主题是用户,并且是第一个版本。

下游,如果您的消费者还配置了应用程序/*avro,他们将能够读取此contentType并推断其主题/版本,以查询架构服务器并检索适当的架构。

 类似资料:
  • 这个问题不难,我已经用自己的方法解决了,但我想听听你的意见,也许有什么方法可以让这成为一个改进的选择?Java 8-11。

  • 我正在构建一个计算器,为了让计算器工作,我需要将字符串中的所有整数转换为双数。例如,如果我有一个字符串:3*8 5/2-4,我想将其转换为:3.0*8.0 5.0/2.0-4.0。我该怎么做? 编辑:如果我有这个字符串:3.0*8.0 5.0/2.0-4,我想将他转换为:3.0*8.0 5.0/2.0-4.0

  • 我正在尝试使用一个名为“start checknumber”的双变量,该变量的值应该为“40305555”,并将其转换为字符串。在调试我的代码时,startCheckNumber显示的值为4.030555e7。如果我执行以下命令将其转换为字符串,它将显示如下所示,而不是“4030555” 在这种情况下,有没有比使用ValueOf更好的方法将double变量转换为String?我尝试了'Double

  • 问题内容: 您如何将此String转换为gson.JsonArray? 这是我的代码: 这是将这个Collections字符串转换为JSonArray的方法吗? 问题答案: 要在JSON数组中包含字符串值,必须记住在Java程序中用反斜杠转义双引号。请参见下面的声明。 您在main()方法中的代码可以正常工作。以下只是对main()方法中的代码的微小修改。 最后,请记住在语句“ com.googl

  • 我将XML作为字符串传递给一个方法,并再次将其转换为XML来完成我的工作。 其正常工作正常,但当出现特殊字符时,如<代码> 我的XML字符串: 我的代码是: 错误: “=”是意外标记。预期标记为“;”。第1行,位置150。 完全错误为: 系统Xml。XmlException未由用户代码处理HResult=-2146232000消息=“=”是意外令牌。预期标记为“;”。第1行,位置150。源=系统。

  • 问题内容: 这可能之前已经被回答过了,但是那是关于unicode的,我不认为这是unicode(它是ASCII的。。。)。 当我在终端中执行此操作时,没有任何问题 但是当我在Java中使用以下内容时 它返回错误:未注册的vm’“ TestMachine”’ 对于其中带有空格的参数(例如Test \ Machine),也是如此,然后它不会转义空格。 现在我认为这与字符编码有关,但是我看不到设置该o_