实际开发中,可能需要多kafka发送的消息在发送前进行操作,比如按照某个规则过滤掉不符合要求的消息,或者屏蔽某些关键词,或者改变某些属性等等,都可以依托拦截器链来实现。
自定义拦截器需要实现ProducerInterceptor接口,根据需要重写相应的方法
如果希望改变发送前的数据值,需要重新onSend方法,从ProducerRecord中取得对应的值,进行自定义的修改,然后重新包装回ProducerRecord
如果希望对消息发送的结果进行处理,则需要重写onAcknowledgement方法,exception有值,说明消息发送失败,可以采取自定义的措施,比如重试等等,也可以用来统计消息发送的成功率
如果希望在Producer关闭时,做一些自己的业务,则可以重写close方法。
自定义拦截器
package com.hulang.kafkaboot.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;
/**
* 自定义拦截器
*/
public class MyProducerInterceptor implements ProducerInterceptor<String, String> {
@Override
public ProducerRecord onSend(ProducerRecord record) {
System.out.println("MyProducerInterceptor 拦截器执行");
String value = (String) record.value();
if ("hello".equals(value)) {
value = "你好";
}
ProducerRecord<String, String> producerRecord = new ProducerRecord<String, String>(
record.topic(),
record.partition(),
record.timestamp(),
(String) record.key(),
value, // 修改后的 value值
record.hea