[英]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.