kafka自定义分区器

1、需求:不同的项目可以根据不同业务逻辑发送到不同的分区,下面写一个简单Demo。如果发送消息包含kafka就发送到分区1,否则发送到分区0;

2、实现步骤

  1)定义类实现partitioner接口

  2)重写partition()方法

public class PartitionerUtil implements Partitioner {
    @Override
    public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) {
        String msgValue = value.toString();
        //create partition
        int partition;
        //partition included or not
        if(msgValue.contains("kafka")){
            partition = 0;
        }else{
            partition = 1;
        }
        return partition;
    }

    @Override
    public void close() {

    }

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

    }
}

  3)发送消息

  

public class KafkaProducer5 {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        Properties properties = new Properties();
        properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,"101.43.232.28:9092");
        properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,StringSerializer.class.getName());
      //配置自定义分区器 properties.put(ProducerConfig.PARTITIONER_CLASS_CONFIG, "com.kafka.utils.PartitionerUtil"); KafkaProducer<String,String> kafkaProducer = new KafkaProducer<String, String>(properties); for(int i=0;i<10;i++){ kafkaProducer.send(new ProducerRecord<>("first", "kafka" + i), new Callback() { @Override public void onCompletion(RecordMetadata recordMetadata, Exception e) { if(null == e){ System.out.println("partition="+recordMetadata.partition()); }else{ System.out.println(e.getMessage()); } } }); } kafkaProducer.close(); } }

  

 

posted @ 2022-03-04 11:11  苦逼的1024  阅读(263)  评论(0)    收藏  举报