簡體   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