首页 > 其他分享 >4. 新版本的生产者API 带有自定义分区和回调函数的生产者

4. 新版本的生产者API 带有自定义分区和回调函数的生产者

时间:2022-09-07 20:24:12浏览次数:80  
标签:producer 自定义 生产者 分区 kafka API key apache org

1. 开启进程

[node123]systemctl stop firewalld

[node123]zkServer.sh start

[node123]kafka-server-start.sh /opt/app/kafka-0.11.0.0/config/server.properties &

[node1]kafka-console-consumer.sh --zookeeper node1:2181 --topic demo

2. java导入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>kafkacode</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.apache.kafka</groupId>
            <artifactId>kafka-clients</artifactId>
            <version>0.11.0.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.kafka</groupId>
            <artifactId>kafka_2.12</artifactId>
            <version>0.11.0.0</version>
        </dependency>
    </dependencies>
</project>

3. java代码

package new_partition_pro;

import org.apache.kafka.clients.producer.Callback;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.clients.producer.RecordMetadata;

import java.util.Properties;

// 新版本的生产者API  带有自定义分区和回调函数的生产者
public class NewProducerPartitionAndCallBack {
    public static void main(String[] args) {
        // 1、定义生产者连接Kafka集群的配置项   key-value格式的
        Properties prop = new Properties();
        prop.put("bootstrap.servers", "192.168.200.111:9092,192.168.200.112:9092,192.168.200.113:9092");
        // key序列化
        prop.put("key.serializer", "org.apache.kafka.common.serialization.IntegerSerializer");
        // value序列化
        prop.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        /**
         * 设置分区类的时候  要求类必须是public权限的(无法通过反射构建)
         * 第二个参数是全限定类名
         */
        prop.put("partitioner.class","new_partition_pro.CustomPartition");

        // 2. 创建一个生产者
        KafkaProducer<Integer, String> producer = new KafkaProducer<Integer, String>(prop);

        // 3、使用生产者向某个主题发送一个数据
        for (int i = 0; i < 100; i++) {
            ProducerRecord<Integer, String> record = new ProducerRecord<Integer, String>("demo", i, "hello" + i);

            final int finalI = i;

            /**
             * 方法就是kafka生产者消息发送完成之后,触发的一个回调函数
             * @param recordMetadata   包含当前这个消息在Topic主题中的分区和offset
             * @param e
             */
            producer.send(record, new Callback() {
                public void onCompletion(RecordMetadata recordMetadata, Exception e) {
                    System.out.println("当前这个数据的分区为:"+recordMetadata.partition() + "---offset:" + recordMetadata.offset());
                    System.out.println("当前的key为:" + finalI);
                }
            });
        }

        /**
         * 4、代表将生产者生产的数据刷新到topic中
         */
        producer.flush();
    }
}
  • 自定义的分区
package new_partition_pro;

import org.apache.kafka.clients.producer.Partitioner;
import org.apache.kafka.common.Cluster;

import java.util.Map;

public class CustomPartition implements Partitioner {
    /**
     * 方法代表分区机制
     * @param s   主题名
     * @param key  发送消息的key值
     * @param bytes  发送消息的key的byte字节数组数据
     * @param value  发送消息的value值
     * @param bytes1  发送消息的value的byte字节数组数据
     * @param cluster  kafka集群
     * @return
     */
    public int partition(String s, Object key, byte[] bytes, Object value, byte[] bytes1, Cluster cluster) {
        /**
         * 根据key值自定义分区机制 分区规则如下:
         * 如果key是3的倍数 那么0号分区
         * 如果key是4的倍数 那么1号分区
         * 如果key不是三的倍数也不是4的倍数 那么放到2号分区
         */
        int num = Integer.parseInt(key.toString());
        if (num % 3 == 0) {
            return 0;
        } else if (num % 4 == 1) {
            return 1;
        } else {
            return 2;
        }
    }

    public void close() {

    }

    public void configure(Map<String, ?> map) {

    }
}

4. 效果图

标签:producer,自定义,生产者,分区,kafka,API,key,apache,org
From: https://www.cnblogs.com/jsqup/p/16667135.html

相关文章

  • zabbix自定义监控mysql主从状态和延迟
    zabbix自定义监控mysql主从状态和延迟目录zabbix自定义监控mysql主从状态和延迟zabbix自定义监控mysql主从状态zabbix自定义监控mysql主从延迟zabbix自定义监控mysql主从......
  • CoreDNS实现自定义域名解析
    参考:https://support.huaweicloud.com/usermanual-cce/cce_01_0361.html一、修改CoreDNSHosts配置修改CoreDNS配置文件,将自定义域名添加到hosts中。例如将www.example.......
  • asp.net webapi 全局设置 所有api controller安全认证的方法、判断是否登录的方法
    asp.netwebapi全局设置所有apicontroller安全认证的方法、判断是否登录的方法1.新建AuthAttribute特性publicclassAuthAttribute:ActionFilterAttribute......
  • 2. 新版本生产者代码--建议使用的版本
    1.开启进程[node123]systemctlstopfirewalld[node123]zkServer.shstart[node123]kafka-server-start.sh/opt/app/kafka-0.11.0.0/config/server.properties&[......
  • Lambda表达式和Stream API
    Lambda表达式和StreamAPILambda表达式是JavaSE8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。lambda表达式就和方法一样,它提供了一个正常的参......
  • Stream API的练习题
    题目:找出2011年发生的所有交易,并按交易额排序(从高到低)。交易员都在哪些不同的城市工作过?查找所有来自Cambridge的交易员,并按姓名排序。返回所有交易员的姓名字......
  • Java8Stream流复习和api总结
    构建方式list.stream();Stream.of(list);基础常用APIStream<Number>stream=list.stream();//获取最大值stream.max(比较器);//获取最小值stream.min(比较器);......
  • drf基本视图类APIView
    rest_framework.views.APIViewAPIView是RESTframework提供的所有视图类的基类,继承自Django的view父类APTview与view的不同之处在于:传入到视图方法中的是RESTfr......
  • API 调试工具 All In One
    API调试工具AllInOne接口调试工具ApifoxApifox是API文档、API调试、APIMock、API自动化测试一体化协作平台,定位Postman+Swagger+Mock+JMeter。htt......
  • SpringBoot使用自定义注解+AOP+Redis实现接口限流
    为什么要限流系统在设计的时候,我们会有一个系统的预估容量,长时间超过系统能承受的TPS/QPS阈值,系统有可能会被压垮,最终导致整个服务不可用。为了避免这种情况,我们就需要对......