簡體   English   中英

如何確保郵件到達kafka經紀人?

[英]How to ensure messages reach kafka broker?

我的本地計算機上有一個消息生成器,遠程主機(aws)上有一個代理。

從生產者發送消息后,我等待並調用遠程主機上的控制台使用者,並看到過多的日志。 沒有生產者的價值。

生產者在調用send方法后刷新數據。 一切都配置正確。

如何檢查代理是否收到了生產者的消息以及生產者是否收到了答復?

Send方法將消息異步發送到主題,並返回Future of RecordMetadata

java.util.concurrent.Future<RecordMetadata> send(ProducerRecord<K,V> record)

異步發送記錄到主題

flush調用后,通過調用isDone方法來檢查Future是否已完成。 (例如, Future.isDone() == true

調用此方法將使所有緩沖的記錄立即可用於發送(即使linger.ms大於0),並在與這些記錄關聯的請求完成時阻塞。 flush()的后置條件是任何先前發送的記錄都將完成(例如Future.isDone()== true)。 根據您指定的acks配置成功確認請求后,該請求即被視為完成,否則會導致錯誤。

RecordMetadata包含offsetpartition

public int partition()

記錄發送到的分區

公共long offset()

記錄的偏移量;如果{hasOffset()}返回false,則返回-1。

或者,您也可以使用回調功能來確保消息是否發送到主題

完全無阻塞的用法可以利用Callback參數來提供一個回調,該回調將在請求完成時被調用。

這是文檔中的清晰示例

 ProducerRecord<byte[],byte[]> record = new ProducerRecord<byte[],byte[]>("the-topic", key, value);
 producer.send(myRecord,
           new Callback() {
               public void onCompletion(RecordMetadata metadata, Exception e) {
                   if(e != null) {
                      e.printStackTrace();
                   } else {
                      System.out.println("The offset of the record we just sent is: " + metadata.offset());
                   }
               }
           });

您可以嘗試send的get()API,它將返回RecordMetadata的Future。

ProducerRecord<String, String> record = 
new ProducerRecord<>("SampleTopic", "SampleKey", "SampleValue");

try {
    producer.send(record).get(); 
} catch (Exception e) {
    e.printStackTrace(); 
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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