完整报错:
org.apache.kafka.common.errors.TimeoutException: Timeout of 60000ms expired before the position for partition heartbeatMessage1-2 could be determined
2021-12-03 16:17:44.253 ERROR 220624 --- [ntainer#2-1-C-1] o.s.k.l.KafkaMessageListenerContainer : Failed to set initial offsets
org.apache.kafka.common.errors.TimeoutException: Timeout of 60000ms expired before the position for partition heartbeatMessage1-1 could be determined
我的感觉应该是分区有问题,比如只创建了一个分区,我却消费第2个分区,但是我在kafka-eagele或者kafkaTool上看都是3个分区,后面还是在kafkaEagle上面突然看到了有的是1个分区的Topic,而这是不可能的,因为我的Topic都是自己手建的,没有默认创建。
后来发现是一字之差
@Bean
public NewTopic initialBHeartBeatMessageTopic() {
return new NewTopic("heartBeatMessage",3, (short) 3);
}
我创建的是heartBeatMessage,而消费的却是
@KafkaListener(groupId = "message", topicPartitions = {
@TopicPartition(topic = "heartbeatMessage",partitions = {"0", "1","2"})
},concurrency = "3")//concurrency就是同组下的消费者个数,就是并发消费数,建议小于等于分区总数
因为kafka没有heartbeartMessage的主题,所以会默认自己创建1个分区1个副本的主题,这样在消费的时候就会出现问题了。
关于如何关闭这个可恶的自动创建Topic功能,毕竟如果没有联想到Topic使用错误的原因,想找到这个bug还是很痛苦的,网上的说法是在kafka的server.properties中加上这句话
auto.create.topics.enable=false
不过我在配置文件中并没有找到这个配置的说明,也没有去尝试,老铁们如果有这个苦恼可以加上试试,当然别忘了所有broker的配置都要改,然后重启kafka。
有疑问可以在评论区交流,作者看见会回复。
如需转载,请一定声明原处。