Java 如何使Kafka使用者从特定主题分区读取Spring Boot

Java 如何使Kafka使用者从特定主题分区读取Spring Boot,java,spring-boot,apache-kafka,Java,Spring Boot,Apache Kafka,我对Kafka和Spring Boot有点陌生,我试图让我的应用程序从主题的特定分区读取 @KafkaListener(id = "singleLnr", groupId = "${kafka.consumer.group.id}",containerFactory = "singleFactory", topicPartitions = @TopicPartition(topic = "${kafka.topic.singleAttendance}", partitions = {"0"})

我对Kafka和Spring Boot有点陌生,我试图让我的应用程序从主题的特定分区读取

 @KafkaListener(id = "singleLnr", groupId = "${kafka.consumer.group.id}",containerFactory = "singleFactory", topicPartitions = @TopicPartition(topic = "${kafka.topic.singleAttendance}", partitions = {"0"}))
public void consume2(ConsumerRecord attendanceInfo) {
    System.out.println(attendanceInfo);
}
单一工厂代码

@Bean(name = "singleFactory")
public KafkaListenerContainerFactory singleFactory() {
    ConcurrentKafkaListenerContainerFactory<String, Map<String, String>> factory = new ConcurrentKafkaListenerContainerFactory<>();
    factory.setConsumerFactory(consumerFactory());
    factory.setBatchListener(false);
    factory.setMessageConverter(converter());
    return factory;
}
@Bean(name=“singleFactory”)
公共KafkaListenerContainerFactory singleFactory(){
ConcurrentKafkListenerContainerFactory=新ConcurrentKafkListenerContainerFactory();
setConsumerFactory(consumerFactory());
factory.setBatchListener(false);
setMessageConverter(converter());
返回工厂;
}
这也是我的消费者工厂配置

 @Bean(name = "consumerFactory")
public ConsumerFactory<String, Map<String, String>> consumerFactory() {
    Map<String, Object> props = new HashMap<>();
    props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaBootstrapAddress);
    props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, true);
    props.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, 1000);
    props.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, 60000);
    props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
    props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
    props.put(ConsumerConfig.GROUP_ID_CONFIG, kafkaConsumerGroupId);
    return new DefaultKafkaConsumerFactory<>(props);
}
@Bean(name=“consumerFactory”)
公共消费者工厂消费者工厂(){
Map props=newhashmap();
props.put(ConsumerConfig.BOOTSTRAP\u SERVERS\u CONFIG,kafkaBootstrapAddress);
put(ConsumerConfig.ENABLE\u AUTO\u COMMIT\u CONFIG,true);
put(ConsumerConfig.AUTO\u COMMIT\u INTERVAL\u MS\u CONFIG,1000);
props.put(ConsumerConfig.SESSION\u TIMEOUT\u MS\u CONFIG,60000);
put(ConsumerConfig.KEY\u反序列化程序\u类\u配置,StringDeserializer.CLASS);
put(ConsumerConfig.VALUE\u反序列化程序\u类\u配置,StringDeserializer.CLASS);
props.put(ConsumerConfig.GROUP\u ID\u CONFIG,kafkaConsumerGroupId);
返回新的默认卡夫卡消费工厂(道具);
}
当我试图运行程序时,它会给我一个错误

偏移量提交在单个分区上失败。偏移量308处为0:协调器不知道此成员

和警告

失败:无法完成提交,因为组已重新平衡并将分区分配给其他成员。这意味着对poll()的后续调用之间的时间比配置的max.poll.interval.ms长,这通常意味着轮询循环在消息处理上花费了太多的时间。您可以通过增加max.poll.interval.ms或使用max.poll.records减少poll()中返回的批的最大大小来解决此问题


如何使我的使用者从特定分区读取?请至少给我一个提示。

卡夫卡正在为每个分区单独分配使用者。在此实现中,无需在@KafkaListener中配置它

@KafkaListener(id = "singleLnr", groupId = "${kafka.consumer.group.id}",containerFactory = "singleFactory", topics = "${kafka.topic.singleAttendance}")
    public void consume2(ConsumerRecord attendanceInfo) {
        System.out.println(attendanceInfo);
    }

Kafka自己为每个分区分配使用者。在此实现中,无需在@KafkaListener中配置它

@KafkaListener(id = "singleLnr", groupId = "${kafka.consumer.group.id}",containerFactory = "singleFactory", topics = "${kafka.topic.singleAttendance}")
    public void consume2(ConsumerRecord attendanceInfo) {
        System.out.println(attendanceInfo);
    }