由于某些特殊情况,可能要采取自定义分区,依赖上一篇有
- 新建分区类
import org.apache.kafka.clients.producer.Partitioner;
import org.apache.kafka.common.Cluster;
import java.util.Map;
/**
1. @author lf
2. @描述 自定义分区
3. @date 2018-09-03
*/
public class MyPartition implements Partitioner {
/**
*
* @param topic 主题
* @param key
* @param keyBytes key的值的字节
* @param value
* @param valueBytes
* @param cluster 集成的元数据
* @return
*/
public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) {
// 总共几个分区
Integer count = cluster.partitionCountForTopic(topic);
System.out.println("count:"+count);
String keyStr = key.toString();
if(count ==3 && keyStr != null){
if("key".equals(keyStr)){
return 0;
} else if("key1".equals(keyStr)){
return 1;
}else if("key2".equals(keyStr)){
return 2;
}
}
return 0;
}
public void close() {
}
public void configure(Map<String, ?> configs) {
}
}
注意,key,key1,key2是你发送消息时,写的key的值
这里只是试一下效果,具体怎么判断,自行书写
加入配置
找到生产者的类,加入
properties.put(ProducerConfig.PARTITIONER_CLASS_CONFIG,"com.lf.kafka.MyPartition");
上述都只是一个简单的实现