繁体   English   中英

Kafka - 反序列化消费者中的对象

[英]Kafka - Deserializing the object in Consumer

我们正在考虑在我们的消息传递中使用 Kafka,我们的应用程序是使用 Spring 开发的。 所以,我们计划使用 spring-kafka。

生产者将消息作为 HashMap 对象放入队列中。 我们有 JSON 序列化器,我们假设地图将被序列化并放入队列中。 这是生产者配置。

spring:
  kafka:
    bootstrap-servers: localhost:9092
    producer:
        key-serializer: org.springframework.kafka.support.serializer.JsonSerializer
        value-serializer: org.springframework.kafka.support.serializer.JsonSerializer

另一方面,我们有一个侦听器,它侦听生产者发布消息的同一主题。 这是消费者配置:

spring:
   kafka:
       consumer:
            group-id: xyz
            key-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
            value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer

我们的监听器方法:

  public void listener(SomeClass abx)

我们期望 json 将被反序列化并生成一个“SomeClass”类型的对象。 但显然,它引发了反序列化异常。

我们看了几篇文章,建议做如下事情:

 @Bean
  public ConsumerFactory<String, Car> consumerFactory() {
    return new DefaultKafkaConsumerFactory<>(consumerConfigs(), new StringDeserializer(),
        new JsonDeserializer<>(Car.class));
  }

我们不想编写一些代码来创建反序列化器。 有没有我们遗漏的样板文件? 任何帮助将不胜感激!!

请参阅引导文档 特别是:

您还可以按如下方式配置 Spring Kafka JsonDeserializer:

spring.kafka.consumer.value-deserializer=org.springframework.kafka.support.serializer.JsonDeserializer

spring.kafka.consumer.properties.spring.json.value.default.type=com.example.Invoice

spring.kafka.consumer.properties.spring.json.trusted.packages=com.example,org.acme

您可以看一下Confluent: https : //www.confluent.io/用另一个词可以说是另一个Kafka层,它使您可以控制Kafka数据。

Confluent的功能之一是序列化,我以这种方式使用它没有问题:

import io.confluent.kafka.serializers.KafkaAvroDeserializerConfig;
import org.apache.kafka.clients.producer.ProducerConfig;

    @Bean
    public Map<String, Object> producerConfigs() {
        Map<String, Object> props = new HashMap<>();

        props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
        props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, io.confluent.kafka.serializers.KafkaAvroSerializer.class);

        props.put(KafkaAvroDeserializerConfig.SCHEMA_REGISTRY_URL_CONFIG, schemaRegistry);
        props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, io.confluent.kafka.serializers.KafkaAvroSerializer.class);

        (...)

        return props;
    }

通过生产者和消费者上的这些属性,您应该不会有任何问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM