producer拦截器(一)

268 阅读1分钟

拦截器接口一共提供了两个方法

  • 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,可以看到确实多了一个前缀 多次输入,直到生产者关闭