Spring Kafka获得分配的分区

时间:2018-02-20 07:04:07

标签: apache-kafka kafka-consumer-api spring-kafka

我知道我可以从哪个分区记录中找到,但我想知道是否可以动态获取在特定时刻为消费者分配的分区?也许我需要实现一些监听器来检测并跟进分区分配信息?

我正在spring-kafka 1.3.2使用ConcurrentKafkaListenerContainerFactory@KafkaListener

2 个答案:

答案 0 :(得分:2)

是的,您可以这样做:

@Bean
public ConsumerAwareRebalanceListener rebalanceListener() {
    return new ConsumerAwareRebalanceListener() { 
        @Override
        public void onPartitionsAssigned(Consumer<?, ?> consumer, Collection<TopicPartition> partitions) {
           // here partitions
        }
    };
}

然后将其添加到例如ConcurrentKafkaListenerContainerFactory

@Bean
public ConcurrentKafkaListenerContainerFactory<Object, Object> kafkaListenerContainerFactory() {
    ConcurrentKafkaListenerContainerFactory<Object, Object> factory = new ConcurrentKafkaListenerContainerFactory<>();

    ContainerProperties props = factory.getContainerProperties();
    props.setConsumerRebalanceListener(rebalanceListener());

    return factory;
}

答案 1 :(得分:0)

我通过使用KafkaListenerEndpointRegistry

以不同的方式进行了操作
for (MessageListenerContainer messageListenerContainer : kafkaListenerEndpointRegistry.getListenerContainers()) {
            List<KafkaMessageListenerContainer> containers = ((ConcurrentMessageListenerContainer) messageListenerContainer).getContainers();

            List<TopicPartition> topicPartitions = (List<TopicPartition>) containers.stream().flatMap(kafkaMessageListenerContainer ->
                            kafkaMessageListenerContainer.getAssignedPartitions().stream()).collect(Collectors.toList());

            partitions.addAll(topicPartitions.stream().map(TopicPartition::partition).collect(Collectors.toList()));
}