[英]how to get acknowledgement from Kafka broker if message is produced by producer?
當我發出消息時,我想從經紀人那里得到一些回應。 我嘗試過在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 api 0.9.1與代理版本0.8.2。
因此,我不能100%確定哪些版本適用於Kafka。 目前我使用的是0.8.2,我知道0.9引入了一些重大變化,但我無法確切地告訴你現在有什么/什么不起作用。
一個非常強烈的建議,我會使用與您的經紀人版本對應的Kafka-Client版本。 如果您使用的是經紀人0.8.2,我也會使用kakfa-client 0.8.2。
你從未提供任何關於你如何使用它的代碼,所以我只是在暗中猜測。 但是我已經在生產者中使用這種方法在Kafka 0.8.2中實現了回調功能。 以下是方法簽名。
public java.util.concurrent.Future<RecordMetadata> send(ProducerRecord<K,V> record, Callback callback)
我將在哪里調用該方法,實際上我使用overriden方法傳入該類。
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發送記錄。 除此之外,我只是在猜測。
有一種簡單的方法可以在KafkaProducer使用kafka 0.9版本發布消息后從代理獲取信息。 您可以調用get()方法,該方法將返回一個RecordMetadata對象,您可以在代碼片段下方獲取諸如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());
關閉制作人 - 一旦完成發布所有消息 - 就像這樣:
producer.close();
這可確保始終調用Callback中的以下方法:
onCompletion(RecordMetadata metadata, Exception exception)
注意:我已經通過將該行添加到此示例Producer類中進行了測試,並且它可以正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.