メッセージを作成するときにブローカーから応答を受け取りたいのですが。 KafkaProducer.send
で使用されるCallBackメカニズム(CallBackを実装することによる)を試しましたが、機能せず、onCompletion
メソッドを呼び出しません。
Kafkaサーバーをシャットダウンしてメッセージを生成しようとすると、コールバックメソッドが呼び出されます。
承認を得る他の方法はありますか?
@Override
public void onCompletion(RecordMetadata metadata, Exception exception) {
long elapsedTime = System.currentTimeMillis() - startTime;
System.out.println("Called Callback method");
if (metadata != null) {
System.out.println("message(" + key + ", " + message
+ ") sent to partition(" + metadata.partition() + "), "
+ "offset(" + metadata.offset() + ") in " + elapsedTime
+ " ms");
} else {
exception.printStackTrace();
}
}
props.put("bootstrap.servers", "localhost:9092");
props.put("client.id", "mytopic");
props.put("key.serializer", org.Apache.kafka.common.serialization.StringSerializer.class);
props.put("value.serializer", org.Apache.kafka.common.serialization.ByteArraySerializer.class);
KafkaProducer<String, byte[]> producer = new KafkaProducer<String,byte[]>(props);
long runtime = new Date().getTime();
String ip = "192.168.2."+ rnd.nextInt(255);
String msg = runtime + ".www.ppop.com," + ip;
producer.send(new ProducerRecord<String, byte[]>("mytopic", msg.getBytes()), `new TransCallBack(Calendar.getInstance().getTimeInMillis(), key, msg));`
kafka-client api0.9.1とブローカーバージョン0.8.2を使用しています。
kafka 0.9バージョンを使用してKafkaProducerによってメッセージを公開した後、ブローカーから情報を取得する簡単な方法があります。次のような情報を取得できるRecordMetadataオブジェクトを返すget()メソッドを呼び出すことができます。例として、コードスニペットの下のoffset、topicPartition:
RecordMetadata m = kafkaProducer.send(new ProducerRecord<byte[], byte[]>(
topic, key.getBytes("UTF-8"), message
.getBytes("UTF-8"))).get();
System.out.println("Message produced, offset: " + m.offset());
System.out.println("Message produced, partition : " + m.partition());
System.out.println("Message produced, topic: " + m.topic());
そのため、Kafkaでどのバージョンがどのバージョンで動作するかを100%確信していません。現在私は0.8.2を使用していますが、0.9でいくつかの重大な変更が導入されたことは知っていますが、現在何が機能するのか、何が機能しないのかを明確に伝えることはできませんでした。
非常に強力な推奨事項の1つは、ブローカーのバージョンに対応するKafka-Clientバージョンを使用することです。ブローカー0.8.2を使用している場合は、kakfa-client0.8.2も使用します。
あなたはこれをどのように使用しているかのコードを提示したことがないので、私は暗闇の中で少し推測しています。しかし、プロデューサーで このメソッド を使用してKafka 0.8.2にコールバック機能を実装しました。以下は、メソッドのシグネチャです。
public Java.util.concurrent.Future<RecordMetadata> send(ProducerRecord<K,V> record, Callback callback)
そのメソッドをどこで呼び出すのか、実際にはオーバーライドされたメソッドを使用してクラスを渡します。
KafkaProducer<String, String> prod = new KafkaProducer<String, String>(props);
ProducerRecord<String, String> record = //data to send to kafka
prod.send(record, new Callback() {
@Override
public void onCompletion(RecordMetadata metadata, Exception e) {
if (e != null) {
e.printStackTrace();
} else {
//implement logic here, or call another method to process metadata
System.out.println("Callback");
}
}
});
私はあなたがそれをしたようにそれをする方法もあると思います。ただし、実際にレコードをKafkaに送信する方法を示すコードを提供する必要があります。それ以外は私が推測しているだけです。
すべてのメッセージの公開が完了したら、次のようにプロデューサーを閉じます。
producer.close();
これにより、コールバックから次のメソッドが常に呼び出されるようになります。
onCompletion(RecordMetadata metadata, Exception exception)
注意:その行を このサンプルのProducerクラス に追加してこれをテストしましたが、機能します。