融合的Kafka Avro序列化器和Spring Cloud

时间:2018-10-31 16:58:59

标签: apache-kafka spring-cloud avro spring-cloud-stream confluent

我正在尝试使用Spring Cloud和Kafka Avro Serializer在Kafka上产生一个事件。

在我的application.yml中,我具有以下配置,但是当序列化器尝试生成消息时,它以字节为单位生成,因为传递给KafkaSerializer中的getScheme方法的对象是字节数组,并且不是GenericRecord。我认为我在Spring Cloud中需要特定的MessageConverter,但没有找到任何内容。

cloud:
stream:
  kafka:
    binder:
      brokers:
        - 'localhost:9092'
      useNativeDecoding: true
    bindings:
      Ptr-output:
          producer:
            configuration:
              schema.registry.url: 'http://localhost:8081'
              key.serializer: org.apache.kafka.common.serialization.StringSerializer
              value.serializer: com.abc.message.ptr.KafkaSerializer
  schemaRegistryClient:
    endpoint: 'http://localhost:8081'
  bindings:
     Ptr-output:
      contentType: application/*+avro
      destination: Ptr
  schema:
    avro:
      schema-locations: 'classpath:avro/Ptr.avsc'
      dynamic-schema-generation-enabled: false

我该怎么办?我该怎么解决?

2 个答案:

答案 0 :(得分:0)

请参见the documentation,尤其是,您需要设置生产者属性useNativeEncoding

  

useNativeEncoding

     

设置为true时,出站消息由客户端库直接序列化,必须进行相应配置(例如,设置适当的Kafka生产者值序列化程序)。使用此配置时,出站邮件编组不是基于绑定的contentType。使用本机编码时,消费者有责任使用适当的解码器(例如,Kafka消费者值反序列化器)对入站消息进行反序列化。另外,使用本机编码和解码时,headerMode = embeddedHeaders属性将被忽略,并且标头不会嵌入消息中。请参阅使用者属性useNativeDecoding。

答案 1 :(得分:0)

尝试将序列化器设置为class AlgoException : public std::exception {} class NewAlgoException : public AlgoException {} try { throw NewAlgoException (); } catch (AlgoException ) { std::cout << 2; } catch (NewAlgoException ) { std::cout << 3; } catch (std::exception) { std::cout << 1; }