2016-10-24 3 views
0

カフカとシリアル化の初心者です。これまでjson形式のカフカイベントをシンプルコードを使ってシリアライズする必要がありました。 Avroエンコーダを使用して余分なイベントが追加されています。だから、私はこの単一の消費者がjsonの場合はStringDeserialzerを使用し、Avroの場合はそれぞれのデシリアライザを使用します。 2つのDeserializerを同じプロパティファイルにマップするにはどうすればよいですか?あなたがラップ両方オリジナルデシリアライザである単一のハイブリッドデシリアライザを提供する必要がメインメソッドカフカコンシューマ用に複数のデシリアライザを使用する

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

シリアライザとデシリアライザをコードで設定できます。この回答を見るhttp://stackoverflow.com/questions/40154086/how-to-create-custom-serializer-in-kafka/40158971#40158971 –

答えて

0

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 

。内部的には、新しいラッピングデシリアライザは、両方のタイプのメッセージを区別し、生のバイトを実際の作業を行う正しいデシリアライザに転送できる必要があります。

あなたが持っているメッセージのタイプを事前に知ることができない場合は、エラーアプローチとして試行することもできます。つまり、デフォルトで1つのシリアライザに渡します。二つ目。

+0

私はデシリアライゼーションの新人で、Avroのデシリアライゼーションは難しいと証明されています。オブジェクトを返しますが、StringDeserializerはStringを返します。Stringは消費者のGsonメソッドを使用してオブジェクトに変換します。どのように戻り値の型としてtryとcatchを使用する一般的なメソッドを作成するか? –

+0

また、ハイブリッド戻り型が必要です。基本的には、ラップする各タイプのメンバーを持つラッパークラスです。ハイブリッドタイプのメッセージを作成するたびに、1人のメンバーを除くすべてのメンバーが「null」になります。シリアライザを書く方法は、あなたの質問へのリンクのリンクに示されています。 –

関連する問題