繁体   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