簡體   English   中英

如果消息是由制作人制作的,如何從Kafka經紀人那里得到確認?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM