Kafka Producer之拦截器

文章目录

  • [1. Producer流程](#1. Producer流程)
  • [2. 代码测试](#2. 代码测试)
  • [3. 测试结果](#3. 测试结果)

1. Producer流程

新建ProducerRecord类后,传入topic、key、value等数据构建Record之后,距离发送至kafka集群还需要经历若干过程。

  1. 拦截器列表,对数据进行过滤,更改等行为,处理异常不会导致流程终止。

  2. 获取Kafka集群元数据

  3. 对数据进行序列化

  4. 根据元数据选择分区和Broker

  5. 数据校验

  6. 进入数据发送缓存区,批次发送

  7. send

2. 代码测试

java 复制代码
public class KafkaProducerInterceptorTest {
    public static void main(String[] args) throws InterruptedException {
        //创建producer
        HashMap<String, Object> config = new HashMap<>();
        config.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:19092");
        config.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        config.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        //指定拦截器
        config.put(ProducerConfig.INTERCEPTOR_CLASSES_CONFIG, ValueInterceptorTest.class.getName());
        KafkaProducer<String, String> producer = new KafkaProducer<String, String>(config);

        for (int i = 0; i < 10; i++) {
            //创建record
            ProducerRecord<String, String> record = new ProducerRecord<String, String>(
                    "test1",
                    "key"+i,
                    "我是你爹"+i
            );
            //发送record
            producer.send(record);
            Thread.sleep(500);
        }

        //关闭producer
        producer.close();
    }
}

拦截器自定义类

java 复制代码
package org.dragon.producer;

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;

/**
 * 自定义value拦截器试验<br/>
 * 1. 实现接口
 * 2. 定义泛型
 * 3. 重写方法
 *
 *
 * @author mumu
 * @date 2024/07/15
 */
public class ValueInterceptorTest implements ProducerInterceptor<String, String> {

    /**
     * 发送数据时会调用这个方法<br/>
     * 让value复制2次
     *
     * @param producerRecord 生产者记录
     * @return {@link ProducerRecord}<{@link String}, {@link String}>
     */
    @Override
    public ProducerRecord<String, String> onSend(ProducerRecord<String, String> producerRecord) {
        return new ProducerRecord<String, String>(producerRecord.topic(), producerRecord.key(), producerRecord.value() + producerRecord.value());
    }

    /**
     * 发送数据完毕,服务器返回的响应,会调用此方法。
     *
     * @param recordMetadata 记录元数据
     * @param e              e
     */
    @Override
    public void onAcknowledgement(RecordMetadata recordMetadata, Exception e) {

    }

    /**
     * 生产者关闭,会调用此方法
     */
    @Override
    public void close() {

    }

    /**
     * 创建生产者对象时调用
     *
     * @param map 地图
     */
    @Override
    public void configure(Map<String, ?> map) {

    }
}

3. 测试结果

可以看到value是复制了2次,成功。

相关推荐
隐擎fox5 小时前
高性能网络爬虫架构设计:基于 Python 的长连接复用与分布式会话池调度实践
分布式·python·网络协议·tcp/ip·高并发·网络爬虫、
闲云自留地11 小时前
云平台存储管理员:Cinder 创建挂载卷 + Swift 分布式存储原理
分布式·wpf·swift
橙子圆12314 小时前
RabbitMQ知识1
分布式·rabbitmq
(Charon)16 小时前
【Kafka】消息队列学习(一):为什么需要Kafka?从消息队列到整体架构
学习·架构·kafka
clz131452116 小时前
风险特征系统 EPC 子系统:基于 Kafka 数据源与数据集配置的 Flink 指标清洗加工
分布式·flink·kafka
富士康质检员张全蛋16 小时前
Kafka实战 生产阶段 消费阶段的拦截器
kafka
海上小飞龙17 小时前
分布式和微服务,一次讲清
分布式·微服务·架构
clz131452118 小时前
用 Akka Actor 模拟消费 Kafka 加工处理并发送到 Flink Out Kafka 的完整示例
flink·kafka·linq
(Charon)18 小时前
【Kafka】消息队列学习(二):Topic、Partition与Offset,消息到底存在哪里
分布式·学习·kafka
陈皮波比茶1 天前
分布式任务调度xxl-job
java·分布式