|NO.Z.00022|——————————|BigDataEnd|——|Hadoop&kafka.V07|——|kafka.v07|拦截器剖析.v01|
一、拦截器剖析
### --- 拦截器
~~~ # Producer拦截器(interceptor)
~~~ 和Consumer端Interceptor是在Kafka 0.10版本被引入的,
~~~ 主要用于实现Client端的定制化控制逻辑。
~~~ # 对于Producer而言,
~~~ Interceptor使得用户在消息发送前以及Producer回调逻辑前有机会对消息做一些定制化需求,
~~~ 比如修改消息等。同时,Producer允许用户指定多个Interceptor按序作用于
~~~ 同一条消息从而形成一个拦截链(interceptor chain)。Intercetpor的实现接口是

### --- org.apache.kafka.clients.producer.ProducerInterceptor,其定义的方法包括:
~~~ # onSend(ProducerRecord):
~~~ 该方法封装进KafkaProducer.send方法中,即运行在用户主线程中。
~~~ Producer确保在消息被序列化以计算分区前调用该方法。
~~~ 用户可以在该方法中对消息做任何操作,
~~~ 但最好保证不要修改消息所属的topic和分区,否则会影响目标分区的计算。
~~~ # onAcknowledgement(RecordMetadata, Exception):
~~~ 该方法会在消息被应答之前或消息发送失败时调用,
~~~ 并且通常都是在Producer回调逻辑触发之前。onAcknowledgement运行在Producer的IO线程中,
~~~ 因此不要在该方法中放入很重的逻辑,否则会拖慢Producer的消息发送效率。
~~~ # close:
~~~ 关闭Interceptor,主要用于执行一些资源清理工作。
~~~ 如前所述,Interceptor可能被运行在多个线程中,因此在具体实现时用户需要自行确保线程安全。
~~~ # 另外倘若指定了多个Interceptor,
~~~ 则Producer将按照指定顺序调用它们,
~~~ 并仅仅是捕获每个Interceptor可能抛出的异常记录到错误日志中而非在向上传递。
~~~ 这在使用过程中要特别留意。
二、自定义拦截器
### --- 创建一个maven项目:demo-07-kafka-customInterceptor
~~~ # 自定义拦截器:
~~~ 实现ProducerInterceptor接口
~~~ 在KafkaProducer的设置中设置自定义的拦截器
### --- 导入pom.xml依赖
<dependencies>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>1.0.2</version>
</dependency>
</dependencies>
### --- 拦截器官方实现
~~~ ProducerInterceptor
public interface ProducerInterceptor<K, V> extends Configurable {
/**
* This is called from {@link org.apache.kafka.clients.producer.KafkaProducer#send(ProducerRecord)} and
public ProducerRecord<K, V> onSend(ProducerRecord<K, V> record); //onSend方法
public void onAcknowledgement(RecordMetadata metadata, Exception exception); //onAcknowledgement方法
### --- ConsumerInterceptors
public class ConsumerInterceptors<K, V> implements Closeable {
private static final Logger log = LoggerFactory.getLogger(ConsumerInterceptors.class);
private final List<ConsumerInterceptor<K, V>> interceptors;
public ConsumerInterceptors(List<ConsumerInterceptor<K, V>> interceptors) {
this.interceptors = interceptors;
}
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
分类:
bdv013-kafka
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix