我想知道kafkaTemplate.send(topic,key,message)方法是否会调用提供的自定义分区程序partition()方法吗?
答案 0 :(得分:0)
嗯,KafkaTemplate
完全基于Apache Kafka客户端Producer
。最终代码如下:
producer.send(producerRecord, buildCallback(producerRecord, producer, future));
key
和topic
实际上是该ProducerRecord
的一部分。
其他所有操作都在KafkaProducer
和其他Kafka Client对象中完成。
特别是Partitioner.partition()
在KafkaProducer
中被调用:
/**
* computes partition for given record.
* if the record has partition returns the value otherwise
* calls configured partitioner class to compute the partition.
*/
private int partition(ProducerRecord<K, V> record, byte[] serializedKey, byte[] serializedValue, Cluster cluster) {
Integer partition = record.partition();
return partition != null ?
partition :
partitioner.partition(
record.topic(), record.key(), serializedKey, record.value(), serializedValue, cluster);
}
这是private Future<RecordMetadata> doSend(ProducerRecord<K, V> record, Callback callback) {
的一部分,从提到的KafkaTemplate.doSend()
调用。
您可以考虑改用此API:
/**
* Send the data to the provided topic with the provided key and partition.
* @param topic the topic.
* @param partition the partition.
* @param timestamp the timestamp of the record.
* @param key the key.
* @param data the data.
* @return a Future for the {@link SendResult}.
* @since 1.3
*/
ListenableFuture<SendResult<K, V>> send(String topic, Integer partition, Long timestamp, K key, V data);
因此,您也可以完全控制partition
。
但不久之后:KafkaTemplate
没有呼叫Partitioner.partition()
。
另一方面:为什么不在您的项目中尝试呢?您甚至可能没有这样的问题来找我们...