前言:今天看到有人说kafka生产者在发送消息后,如果发生异常,异常捕获方法里拿不到消息的数据,我想了想,感觉不太对劲,所以验证了一下。
首先说下结论:kafka是不会在生产者发送消息的回调中,把发送的消息再一次返回回来的,因为这些消息我们可以自己记录,没必要浪费网络资源。
kafka-client的回调方法
kafka原生的kafka-client包中,生产者发送回调方法如下,其中RecordMetadata包含发送成功后的分区、偏移量和时间戳等信息;Exception是发送失败后的异常信息
producer.send(record, new Callback() {
@Override
public void onCompletion(RecordMetadata metadata, Exception exception) {
System.out.println(metadata.partition() + "---" + metadata.offset());
}
});
可以发现确实回调方法里确实不包含消息数据,但是我们可以自己继承Callback类,添加消息属性,在send的时候使用我们自己写的callback类,这样就能拿到消息数据了,例子如下:
class MyCallback implements Callback {
private Object msg;
public MyCallback(Object msg) {
this.msg = msg;
}
@Override
public void onCompletion(RecordMetadata metadata, Exception exception) {
}
}
producer.send(record, new MyCallback(record));
springboot中的kafka回调
那么spring提供的spring-kafka里面是怎么处理的呢,在spring中,使用kafka生产者发送消息的方法如下:
/**
* 发送消息并接收回调
*
* @param msg
*/
public void sendAndCallback(String msg) {
ListenableFuture<SendResult<String, Object>> future = kafkaTemplate.send("DrewTest"<