需求:给每条数据加上时间戳 并统计成功或者失败的数量
时间戳拦截器
package my.test.interceptor;
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;
/**
* @author WGY
* 自定义拦截器
* 需求 给每一条数据加上时间戳
*/
public class TimeInterceptor implements ProducerInterceptor<String,String> {
@Override
public void configure(Map<String, ?> configs) {
}
@Override//处理每一条数据
public ProducerRecord<String, String> onSend(ProducerRecord<String, String> record) {
//1、取出数据 (其实不用取出,但是取出来后面就用一下)
String value = record.value();
//2、时间戳
long time = System.currentTimeMillis();
//3、创建一个新的ProducerRecord 用来返回 要保证属性与原来的饿topic相同
return new ProducerRecord<String,String>(record.topic(),record.partition(),record.key(),time+"--"+value);
}
@Override
public void onAcknowledgement(RecordMetadata metadata, Exception exception) {
}
@Override
public void close() {
}
}
统计拦截器
package my.test.interceptor;
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;
/**
* @author WGY
* 自定义拦截器
* 需求 记录数据成功或者失败的条数
*/
public class CounterInterceptor implements ProducerInterceptor<String,String> {
@Override
public void configure(Map<String, ?> configs) {
}
@Override
public ProducerRecord<String, String> onSend(ProducerRecord<String, String> record) {
return record;
// return null;
}
//变量写在外面 后面close方法要输出用
int success;
int error;
@Override
public void onAcknowledgement(RecordMetadata metadata, Exception exception) {
if(metadata != null){
success++;
}else{
error++;
}
}
@Override
public void close() {
System.out.println("success"+success);
System.out.println("error"+error);
}
}
使用自定义拦截器的Producer
package my.test.interceptor;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.clients.producer.ProducerRecord;
import java.util.ArrayList;
import java.util.Properties;
/**
* @author WGY
* 使用拦截器的Producer
*/
public class InterceptorProducer {
public static void main(String[] args) {
Properties prop = new Properties();
// prop.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,"hadoop1:9092");
prop.put("bootstrap.servers", "hadoop1:9092");
prop.put("acks", "all");
prop.put("key.serializer",
"org.apache.kafka.common.serialization.StringSerializer");
prop.put("value.serializer",
"org.apache.kafka.common.serialization.StringSerializer");
//添加自定义拦截器
ArrayList<Object> interceptors = new ArrayList<>();
interceptors.add("my.test.interceptor.TimeInterceptor");
interceptors.add("my.test.interceptor.CounterInterceptor");
prop.put(ProducerConfig.INTERCEPTOR_CLASSES_CONFIG,interceptors);
//9、创建生产者对象
KafkaProducer<String, String> producer = new KafkaProducer<>(prop);
//10、发送数据
for (int i = 0; i < 10; i++) {
System.out.println(i+1);
//先创建这个分区
producer.send(new ProducerRecord<String,String>("first1","11111","aaa"+i));
}
//关闭资源 不关闭虚拟机上消费者接收不到
producer.close();
}
}