kafkaサーバーからのメッセージを使用する単純なクラスがあります。コードの大部分はorg.Apache.kafka.clients.consumer.KafkaConsumer.Javaのコメントからコピーされます。
public class Demo {
public static void main(String[] args) {
Properties props = new Properties();
props.put("metadata.broker.list", "192.168.144.10:29092");
props.put("group.id", "test");
props.put("session.timeout.ms", "1000");
props.put("enable.auto.commit", "true");
props.put("auto.commit.interval.ms", "10000");
KafkaConsumer<byte[], byte[]> consumer = new KafkaConsumer<byte[], byte[]>(props);
consumer.subscribe("voltdbexportAUDIT", "voltdbexportTEST");
boolean isRunning = true;
while (isRunning) {
Map<String, ConsumerRecords<byte[], byte[]>> records = consumer.poll(100);
process(records);
}
consumer.close();
}
private static Map<TopicPartition, Long> process(Map<String, ConsumerRecords<byte[], byte[]>> records) {
Map<TopicPartition, Long> processedOffsets = new HashMap<>();
for (Map.Entry<String, ConsumerRecords<byte[], byte[]>> recordMetadata : records.entrySet()) {
List<ConsumerRecord<byte[], byte[]>> recordsPerTopic = recordMetadata.getValue().records();
for (int i = 0; i < recordsPerTopic.size(); i++) {
ConsumerRecord<byte[], byte[]> record = recordsPerTopic.get(i);
// process record
try {
processedOffsets.put(record.topicAndPartition(), record.offset());
} catch (Exception e) {
e.printStackTrace();
}
}
}
return processedOffsets;
}
}
私は「org.Apache.kafka:kafka-clients:0.8.2.0」を使用しています。例外をスローします
Exception in thread "main" org.Apache.kafka.common.config.ConfigException: Missing required configuration "key.deserializer" which has no default value.
at org.Apache.kafka.common.config.ConfigDef.parse(ConfigDef.Java:124)
at org.Apache.kafka.common.config.AbstractConfig.<init>(AbstractConfig.Java:48)
at org.Apache.kafka.clients.consumer.ConsumerConfig.<init>(ConsumerConfig.Java:194)
at org.Apache.kafka.clients.consumer.KafkaConsumer.<init>(KafkaConsumer.Java:430)
at org.Apache.kafka.clients.consumer.KafkaConsumer.<init>(KafkaConsumer.Java:413)
at org.Apache.kafka.clients.consumer.KafkaConsumer.<init>(KafkaConsumer.Java:400)
at kafka.integration.Demo.main(Demo.Java:26)
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:62)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
at Java.lang.reflect.Method.invoke(Method.Java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.Java:140)
Key.deserializerはどのように設定すればよいですか?
これは、独自のシリアライザを実装しなくても、すぐに機能します
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "test");
props.put("enable.auto.commit", "true");
props.put("auto.commit.interval.ms", "1000");
props.put("session.timeout.ms", "30000");
props.put("key.deserializer","org.Apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer","org.Apache.kafka.common.serialization.StringDeserializer");
props.put("partition.assignment.strategy", "range");
プロパティを設定する必要があります:
props.put("serializer.class","my.own.serializer.StringSupport");
props.put("key.serializer.class","my.own.serializer.LongSupport");
それらをプロデューサーのコンストラクターに渡すように、メインメソッドで。もちろん、正しいエンコーダを指定する必要があります。シリアライザクラスはメッセージをバイト配列に変換し、key.serializerクラスはキーオブジェクトをバイト配列に変換します。一般的には、プロセスを逆にすることもできます。
キーと値のパラメーターのバイト配列を処理しています。したがって、バイトシリアライザーとデシリアライザーが必要です。
プロパティを追加できます
デシリアライズ用
props.put("key.deserializer","org.Apache.kafka.common.serialization.ByteArrayDeserializer");
シリアライズ用
props.put("value.deserializer","org.Apache.kafka.common.serialization.ByteArraySerializer");
クラスオブジェクトではなく、逆シリアル化クラスの文字列値を渡すようにしてください(これは私の間違いでした)。
_props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG,
Serdes.String().deserializer().getClass().getName());
_
.getName()
を忘れると、同じ例外が発生し、その場合は誤解を招きます。
キーには、次のいずれかを使用します
文字列キー
properties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
JSONキー
properties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, JsonDeserializer.class);
Avroキー
properties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, io.confluent.kafka.serializers.KafkaAvroDeserializer.class);
ByteArrayキー
properties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, ByteArrayDeserializer.class);
同様に、値のデシリアライザーには次のいずれかを使用します。
文字列値
properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
JSON値
properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JsonDeserializer.class);
Avro値
properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, io.confluent.kafka.serializers.KafkaAvroDeserializer.class);
ByteArray値
properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, ByteArrayDeserializer.class);
Avro deserialisersの場合、次の依存関係が必要になることに注意してください。
<dependency>
<groupId>io.confluent</groupId>
<artifactId>kafka-avro-serializer</artifactId>
<version>${confluent.version}</version>
</dependency>
<dependency>
<groupId>org.Apache.avro</groupId>
<artifactId>avro</artifactId>
<version>${avro.version}</version>
</dependency>