Kafka - 如何在Producer类

时间:2017-08-06 05:10:47

标签: java apache-kafka kafka-producer-api

Kafka允许通过Producer(KafkaProducer)类下面的方法发送异步消息:

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

成功可以通过来处理 1)Future<RecordMetaData>对象或
2)回调调用的onCompletion方法。完整方法签名和onCompletion的使用情况如下(taken from kafka docs

`

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

虽然需要通过传递给Exception e方法的onCompletion处理失败

到目前为止,每件事看起来都很好。

但是如果我做对了,可以从exceptione对象获得的任何合理信息都是stacktrace和exception message。我在这里指出的是,e不包含发送的实际记录的任何信息。或者换句话说,它不包含对发送给kafka代理的实际record的引用。因此,如果record未成功发送,生产者可以进行哪些有用的处理或处理。真的不多。 为什么我说这是 - 理想情况下我想在某个地方记录失败的消息,然后尝试重新发送它。但是由于框架提供的信息很少(e),我觉得这是不可能的。

有人可以指出我是对还是错?

1 个答案:

答案 0 :(得分:1)

您可以轻松创建一个接收producerRecord作为构造函数参数的回调。因此,在onCompletion有异常时,您可以完全了解生产者记录,甚至尝试再次发送。

我处理了同样的问题。创建了一个同时获得producerRecord的回调,以及一个使用执行程序服务再次发送记录的回调处理程序。所以最终,我可以容忍任何数量的失败(例如网络问题或kafka失败),并从中恢复。