CC00022.kafka——|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;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yanqi_vip

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值