1

I saw and implemented the method KafkaTemplate.send(TOPIC,message) with default partitioner class.

But here, I am not passing keys. I have a simple custom partitioner class and I also wanna send to kafka server like KafkaTemplate(TOPIC,key,message) where in producerConfig I set my customPartitioner class for partitioning.

I saw this Will send(Topic, Key, Message) method of KafkaTemplate calls Partition method if I provide custom Partitioner? but I didn't get it fully.

  1. my simple customPartitioner class:
public class CustomPartitionar implements Partitioner {
   private PartitionMapper newMapper;
   public CustomPartitionar(){
       newMapper = new PartitionMapper();
   }
   @Override
   public void configure(Map<String, ?> configs) {

   }
   @Override
   public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes,Cluster cluster) {
       int partition = 0;
       String userName = (String) key;
       // Find the id of current user based on the username from another mapper class
       Integer userId = newMapper.findUserId(userName);
       // If the userId not found, default partition is 0
       if (userId != null) {
           partition = userId;
       }
       return partition;
   }
   @Override
   public void close() {
   }
}
  1. added this class to producerFactory:
config.put(ProducerConfig.PARTITIONER_CLASS_CONFIG, CustomPartitionar.class);
  1. actually my key will be get from "message.getReceiver()" and topic will be get from "message.getTopic()" so my messages will go to desired topic and partition belongs to that user/group..so I just wanna send like:
KafkaTemplate.send(message.getTopic(),message.getReceiver(),message)

can this be possible in a simple way or am I missing something?

Snow
  • 3,820
  • 3
  • 13
  • 39
Nafiul Alam Fuji
  • 407
  • 7
  • 17
  • It's not clear what you question is; what you have should work fine. If it's not, then explain what's happening. – Gary Russell May 19 '20 at 15:26
  • does KafkaTemplate already has method ".send(topic,key,value)" ? as far as I saw kafkatemplate has method like ".send(topic,message)" ..I am confused how can I also specify the "key" in here while sending after adding custom partitionar – Nafiul Alam Fuji May 19 '20 at 16:56

1 Answers1

6

The KafkaTemplate has several send methods:

/**
 * Send the data to the default topic with no key or partition.
 * @param data The data.
 * @return a Future for the {@link SendResult}.
 */
ListenableFuture<SendResult<K, V>> sendDefault(V data);

/**
 * Send the data to the default topic with the provided key and no partition.
 * @param key the key.
 * @param data The data.
 * @return a Future for the {@link SendResult}.
 */
ListenableFuture<SendResult<K, V>> sendDefault(K key, V data);

/**
 * Send the data to the default topic with the provided key and partition.
 * @param partition the partition.
 * @param key the key.
 * @param data the data.
 * @return a Future for the {@link SendResult}.
 */
ListenableFuture<SendResult<K, V>> sendDefault(Integer partition, K key, V data);

/**
 * Send the data to the default topic with the provided key and partition.
 * @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>> sendDefault(Integer partition, Long timestamp, K key, V data);

/**
 * Send the data to the provided topic with no key or partition.
 * @param topic the topic.
 * @param data The data.
 * @return a Future for the {@link SendResult}.
 */
ListenableFuture<SendResult<K, V>> send(String topic, V data);

/**
 * Send the data to the provided topic with the provided key and no partition.
 * @param topic the topic.
 * @param key the key.
 * @param data The data.
 * @return a Future for the {@link SendResult}.
 */
ListenableFuture<SendResult<K, V>> send(String topic, K key, V data);

/**
 * Send the data to the provided topic with the provided key and partition.
 * @param topic the topic.
 * @param partition the partition.
 * @param key the key.
 * @param data the data.
 * @return a Future for the {@link SendResult}.
 */
ListenableFuture<SendResult<K, V>> send(String topic, Integer partition, K key, V data);

/**
 * 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);

/**
 * Send the provided {@link ProducerRecord}.
 * @param record the record.
 * @return a Future for the {@link SendResult}.
 * @since 1.3
 */
ListenableFuture<SendResult<K, V>> send(ProducerRecord<K, V> record);

/**
 * Send a message with routing information in message headers. The message payload
 * may be converted before sending.
 * @param message the message to send.
 * @return a Future for the {@link SendResult}.
 * @see org.springframework.kafka.support.KafkaHeaders#TOPIC
 * @see org.springframework.kafka.support.KafkaHeaders#PARTITION_ID
 * @see org.springframework.kafka.support.KafkaHeaders#MESSAGE_KEY
 */
ListenableFuture<SendResult<K, V>> send(Message<?> message);
Gary Russell
  • 166,535
  • 14
  • 146
  • 179
  • Don't put code in comments; it's unreadable. Edit the question instead and comment that you have done so. I can assure you that `send(topic, key, value)` is there. The template declaration should be `new KafkaTemplate`. You will get a compiler error with 3 generic parameters. The 2 genericl parameters represent the key type and value type. With `` you will be able to use `send(String topic, String key, Message message)`. – Gary Russell May 20 '20 at 15:20
  • ` ListenableFuture> future ; future = (ListenableFuture>) kafkaTemplate.send(TOPIC,KEY,message); future.addCallback(new ListenableFutureCallback>() {@override onSuccess() and onFailure.....}` here cannot resolve "addCallback() method"..why is that? in config, producerFactory have anything to do with that? – Nafiul Alam Fuji May 20 '20 at 15:33
  • One more time - code in comments is unreadable. I suggest you ask a new question. – Gary Russell May 20 '20 at 15:45
  • ok.. and yeah.. KafkaTemplate.send(topic,key,message) is working.. thanx..! – Nafiul Alam Fuji May 22 '20 at 07:34