簡體   English   中英

從Kafka使用者反序列化Java對象

[英]Deserializing Java objects from Kafka consumer

我有一個Kafka Consumer,目前配置有:

kafkaProps.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
kafkaProps.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());

但我真正想要的是能夠使用Kryo Deserializer代替:

public class KryoPOJODeserializer<T> implements Deserializer<T> {

    private Kryo kryo = new Kryo();

    @Override
    public void configure(Map props, boolean isKey) {
        kryo.setInstantiatorStrategy(new DefaultInstantiatorStrategy(new StdInstantiatorStrategy()));
        kryo.register( Arrays.asList( "" ).getClass(), new ArraysAsListSerializer() );
    }

    @Override
    public T deserialize(String topic, byte[] data) {
        // Deserialize the serialized object.
        return kryo.readObject(new Input(data), T.class);
    }

    @Override
    public void close() {

    }

}

我無法弄清楚的是,是否有可能為不同的主題重用相同的消費者(每個主題上都有不同類型的POJO)? 如果我的消費者配置是:

kafkaProps.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, KryoPOJODeserializer.class.getName());

或者,我是否必須為每個主題都有一個單獨的消費者?

或者,我是否必須刪除反序列化器的泛型部分,始終返回一個Object,並將Object轉換為客戶端代碼中的相關POJO? 就像是:

public class KryoPOJODeserializer implements Deserializer {

    private Kryo kryo = new Kryo();

    @Override
    public void configure(Map props, boolean isKey) {
        kryo.setInstantiatorStrategy(new DefaultInstantiatorStrategy(new StdInstantiatorStrategy()));
        kryo.register( Arrays.asList( "" ).getClass(), new ArraysAsListSerializer() );
    }

    @Override
    public Object deserialize(String topic, byte[] data) {
        // Deserialize the serialized object.
        return kryo.readClassAndObject(new Input(new ByteArrayInputStream(data)));
    }

    @Override
    public void close() {

    }

}

后者會工作,但感覺有點臟。

任何建議贊賞!

您可以通過將Deserializer實例直接傳遞給Consumer來使用原始方法:

KafkaConsumer<String, Foo> consumer = new KafkaConsumer<>(properties,
    new StringDeserializer(), new KryoPOJODeserializer(Foo.class));

如果要為多個主題重用相同的傳入數據類型,則可以使用單個使用者設置對這些主題的訂閱。 如果您想要值的不同對象類型,那么您將需要使用多個使用者。

否則你的第二種方法也是有效的。

暫無
暫無

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

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