首先定义一个自定义分区类
package Partition;
import org.apache.kafka.clients.producer.Partitioner;
import org.apache.kafka.common.Cluster;
import org.apache.kafka.common.PartitionInfo;
import java.util.List;
import java.util.Map;
public class Mypartition implements Partitioner {
//下述方法在消息存储到相应分区之前,都会被回调一次
//原因:消息得找到自己存储的所在
public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueTypes, Cluster cluster) {
//1、获得当前主体的分区数
List<PartitionInfo> partitionInfos
= cluster.availablePartitionsForTopic(topic);
int totalPartitionNum = partitionInfos.size();
//2、key的hash码值对分区数求余数
// key!=null,key的hash码值对分区数求余数,余数即为当前消息所对应的分区号
// key==null,根据value
// value!=null,value的hash码值对分区数求余数,余数即为当前消息所对应的分区号
// value==null,默认分区编号
if(key!=null){
return key.hashCode()%totalPartition