簡體   English   中英

為kafka消費者使用多個反序列化器

[英]Using multiple deserializers for a kafka consumer

我是kafka的新手甚至是序列化。 到目前為止,我被要求使用簡單的代碼處理json格式的kafka事件序列化。 但現在使用Avro編碼器添加了額外的事件。 所以現在我希望這個單一的消費者在json中使用StringDeserialzer,而在Avro中使用它的各自的反序列化器。 但是如何在同一個屬性文件中映射2個反序列化器呢?

private Properties getProps(){
    Properties props = new Properties();
    props.put("group.id", env.getProperty("group.id"));
    props.put("enable.auto.commit", env.getProperty("enable.auto.commit"));
    props.put("key.deserializer", env.getProperty("key.deserializer"));
    props.put("value.deserializer", env.getProperty("value.deserializer"));
    return props;
}//here as only value can be mapped to "key.deserializer" is there anyway to do this

在主要方法

KafkaConsumer<String, String> _consumer = new KafkaConsumer<>(getProps());
consumers.add(_consumer);
_consumer.subscribe(new ArrayList<>(topicConsumer.keySet()));

您需要提供一個包含兩個原始解串器的混合反序列化器。 在內部,新的包裝解串器必須能夠區分兩種類型的消息,並將原始字節轉發到執行實際工作的正確解串器。

如果你事先無法知道你有什么類型的消息,你也可以嘗試一種錯誤方法 - 即默認情況下將其交給一個序列化程序,如果這個失敗(即拋出異常),請嘗試第二個。

只需編寫一個通用的反序列化器,它將主題委托給匹配的反序列化器。

public class GenericDeserializer extends JsonDeserializer<Object>
{
    public GenericDeserializer()
    {
    }

    @Override
    public Object deserialize(String topic, Headers headers, byte[] data)
    {
        switch (topic)
        {
        case KafkaTopics.TOPIC_ONE:
            TopicOneDeserializer topicOneDeserializer = new TopicOneDeserializer();
            topicOneDeserializer.addTrustedPackages("com.xyz");
            return topicOneDeserializer.deserialize(topic, headers, data);
        case KafkaTopics.TOPIC_TWO:
            TopicTwoDeserializer topicTwoDeserializer= new TopicTwoDeserializer();
            topicTwoDeserializer.addTrustedPackages("com.xyz");
            return topicTwoDeserializer.deserialize(topic, headers, data);
        }
        return super.deserialize(topic, data);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM