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

时间:2017-06-28 09:29:18

标签: spring-cloud-stream

我遇到一个问题,即源发送GenericMessage [payload = xxxxx,...]而sink接收消息为10,120,120,120,120,120。

我设置Avro邮件转换器后发生此问题。如果我删除Avro消息转换器并使用StreamListener来处理消息转换,它将正常工作。

源application.properties

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 个答案:

答案 0 :(得分:2)

这是一个简单的规则:

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

因此,如果您设置@EnableSchemaRegistryClient,那么您将委派外部注册表来获取您的架构。在这种情况下,您不仅需要注册表,还需要在那里注册的模式。

默认情况下,如果启用spring.cloud.stream.schema.avro.dynamicSchemaGenerationEnabled,生产者将自动注册任何类型为SpecificRecord / GenericRecord或Pojos的有效负载。

在这种情况下,制作人实际上会将标题设置为application/vnd.user.v1+avro,假设您的主题是用户,并且它是第一个版本。

下游,如果您的消费者也配置了application/*+avro contentType,他们将能够阅读此contentType并推断它的主题/版本,以便查询架构服务器并检索相应的架构。

答案 1 :(得分:1)

如果您要设置spring.cloud.stream.bindings.toGreeting.contentType=application/*+avro,则需要使用AvroSchemaRegistryClientMessageConverter(由SCSt配置)并且您不必设置explicit转换器{{1对于MimeType topic1MessageConverter

如果您想使用此转换器,则需要设置avro/bytes