[英]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
包含offset
和partition
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();
}
使用“一次發送”,您無需擔心消息是否到達: https : //www.baeldung.com/kafka-exactly-once,https : //www.confluent.io/blog/一旦語義完全可能,這就是Apache Kafka的處理方式/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.