拦截器接口一共提供了两个方法
- onSend()可以在消息发送前做一些准备工作
- onAcknowledgement()在消息发送失败或者消息被应答之前进行一些处理,优先于用户设定的Callback 注意onAcknowledgement()里返回的是RecordMetadata,当中记录的信息我们最好不好去修改
import java.util.Map;
import org.apache.kafka.clients.producer.ProducerInterceptor;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.clients.producer.RecordMetadata;
/**
* @author TongHao on 2021/1/9
*/
public class ProducerInterceptorAnalysis implements ProducerInterceptor<String, String> {
private volatile long success = 0L;
private volatile long fail = 0L;
@Override
public ProducerRecord<String, String> onSend(ProducerRecord<String, String> record) {
String modifiedValue = "dhu-" + record.value();
return new ProducerRecord<>(record.topic(), record.partition(), record.timestamp(), record.key(), modifiedValue,
record.headers());
}
@Override
public void onAcknowledgement(RecordMetadata recordMetadata, Exception e) {
if (e == null) {
success++;
} else {
fail++;
}
}
@Override
public void close() {
System.out.println("[INFO] 发送结束, 成功: " + success + "次, 失败:" + fail + "次!");
}
@Override
public void configure(Map<String, ?> map) {
}
}
在配置文件中追加一行,指定拦截器
properties.put(ProducerConfig.INTERCEPTOR_CLASSES_CONFIG, ProducerInterceptorAnalysis.class.getName());
运行broker、producer、consumer,观察效果。先看打印日志,可以看到已经使用了指定的拦截器
在producer输入消息,这里的offset从3开始,是因为我用的topic没换,之前发过两条消息,之前的代码见第二篇
看consumer,可以看到确实多了一个前缀
多次输入,直到生产者关闭