![](/img/trans.png)
[英]Why are there multiple deserializers in kafka like string,byte, short?
[英]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.