kafka拦截器一共有两种,生产者和消费者. 生产者拦截器可以在消息发送前做一些准备、校验工作,也可以修改消息的内容.
自定义拦截器实现如下:
import org.apache.kafka.clients.producer.ProducerInterceptor;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.clients.producer.RecordMetadata;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
/**
* 拦截器一共有两种,生产者和消费者
* 生产者拦截器可以在消息发送前做一些准备、校验工作,也可以修改消息的内容
*/
public class MyProducerInterceptor implements ProducerInterceptor<String,String> {
private AtomicInteger successCount = new AtomicInteger(0);
private AtomicInteger failedCount = new AtomicInteger(0);
@Override
public ProducerRecord<String, String> onSend(ProducerRecord<String, String> record) {
String newValue = "leo - "+record.value();
return new ProducerRecord<>(record.topic(),record.partition(),
record.timestamp(),record.key(),newValue,record.headers());
}
// producer会在消息被应答之前或消息发送失败的时候调用拦截器此方法,优先于设置的Callback方法
// 这个方法是运行在producer的I/O线程中,不能过长导致I/O阻塞
@Override
public void onAcknowledgement(RecordMetadata metadata, Exception exception) {
if(exception !=null ){
failedCount.incrementAndGet();
}else{
successCount.incrementAndGet();
}
}
@Override
public void close() {
}
@Override
public void configure(Map<String, ?> configs) {
}
}
然后在Producer的Properties属性中增加如下属性,将自定义拦截器配置进去:
properties.setProperty(ProducerConfig.INTERCEPTOR_CLASSES_CONFIG,MyProducerInterceptor.class.getName())