package eu.europeana.cloud.service.mcs.kafka;
import kafka.producer.Partitioner;
import kafka.utils.VerifiableProperties;
/**
* Used to route messages to different partitions using routingKey.
*
*/
public class CustomPartitioner implements Partitioner {
/**
* Constructs a CustomizePartitioner.
*
* @param props
* unused but required by Kafka.
*/
public CustomPartitioner(VerifiableProperties props) {
}
/**
* Returns partition id for given routing key and number of partitions.
*
* @param routingKey
* used to route message to partitions
* @param numPartitions
* number of partitions
* @return partition id
*/
@Override
public int partition(Object routingKey, int numPartitions) {
if (routingKey instanceof String) {
return getPartitionIdFromStringRoutingKey((String) routingKey, numPartitions);
}
throw new RuntimeException("Unsuppored argument as parttition key");
}
/**
* Routing messages to different partitions via routingKey.
*
* @param routingKey
* used to route message to partitions
* @param numPartitions
* number of partitions
* @return number of routed partition
*/
private int getPartitionIdFromStringRoutingKey(String routingKey, int numPartitions) {
final int hash = Integer.valueOf(routingKey);
return Math.abs(hash % numPartitions);
}
}