kafka学习--Partitioner API--代码演示

自定义分区

package my.test.Partitioner;

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

import java.util.Map;

/**
 * @author WGY
 * 自定义分区
 */
public class MyPartitioner implements Partitioner {
    @Override//这里的Object类型 表示已经序列化之后了
    public int partition(String topic, Object key, byte[] bytes, Object value, byte[] bytes1, Cluster cluster) {
//        //当前传入的topic有多少个分区
//        Integer integer = cluster.partitionCountForTopic(topic);
//        int a = key.toString().hashCode() % integer;
//        return a;

        //此处根据业务逻辑自行编写  这里演示返回0分区
        return 0;
    }

    @Override//关闭的
    public void close() {

    }

    @Override//读配置信息
    public void configure(Map<String, ?> map) {

    }
}

使用自定义分区的Producer

package my.test.Partitioner;

import org.apache.kafka.clients.producer.*;

import java.util.Properties;

/**
 * @author WGY
 * 使用自定义分区的producer
 */
public class PartitionProducer {
    public static void main(String[] args) {
        Properties prop = new Properties();
//        prop.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,"hadoop1:9092");
        prop.put("bootstrap.servers", "hadoop1:9092");
        prop.put("acks", "all");
        prop.put("key.serializer",
                "org.apache.kafka.common.serialization.StringSerializer");
        prop.put("value.serializer",
                "org.apache.kafka.common.serialization.StringSerializer");
        //添加自定义分区器
        prop.put("partitioner.class","my.test.Partitioner.MyPartitioner");
        //9、创建生产者对象
        KafkaProducer<String, String> producer = new KafkaProducer<>(prop);
        //10、发送数据
        for (int i = 0; i < 10; i++) {
            System.out.println(i+1);
            //先创建这个分区
            producer.send(new ProducerRecord<String, String>("first1", "aaa" + i), new Callback() {
                @Override
                public void onCompletion(RecordMetadata recordMetadata, Exception e) {
                    if (e == null){
                        System.out.println(recordMetadata.partition()+"--"+recordMetadata.offset());
                    }else{
                        e.printStackTrace();
                    }
                }
            });
        }
        //关闭资源  不关闭虚拟机上消费者接收不到
        producer.close();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值