任何人都可以帮助我解决以下问题。我正在使用 kafka-clients-0.10.1.1(单节点单经纪人)
auto.create.topics.enable 的默认值为true。
1.我正在使用
向主题发送消息 kafkaProdcuer<String,String> producer> producer...
producer.send(new ProducerRecord<String, String>("my- topic","message"));
producer.close();
消费:
kafkaConsumer<String,String> consumer....
consumer.subscribe(Arrays.asList("my-topic"));
ConsumerRecords<String, String> records = consumer.poll(200);
while(true){
for (ConsumerRecord<String, String> record : records) {
System.out.println(record.value());
}
}
问题是当我第一次运行消费者时,它没有得到值。我必须运行生产者并再次运行消费者以获取值。有时我必须运行生产者3次。 为什么这样做?
2。)enable.auto.commit = false
如果enable.auto.commit属性为false,那么同一个消费者可以多次读取消息吗?
3.)在第一点考虑我的消费者代码。我怎样才能打破循环?我的意思是消费者如何知道它已阅读所有消息然后调用consumer.close()
答案 0 :(得分:1)
1)您是否总是在消费者中使用相同的group.id?你在消费前生产吗?这可能与消费者群体和抵消管理有关。请参阅this answer about consumer offset behavior。
2)不确定您是故意还是意外地阅读重复内容。只要消息由于主题保留策略而未被删除,您就可以再次阅读相同的消息以寻找该位置。如果你的意思是,auto-commit设置为false只意味着消费者不会为你提交偏移,你必须手动调用commitSync()或commitAsync()。在任何情况下,您的消费者仍有可能在提交之前处理消息并崩溃,在这种情况下,当消费者恢复时,它将再次读取那些已处理但未提交的消息。如果您只需要一次语义,则必须执行其他操作,例如以已处理的消息原子方式存储偏移量。
3)正如Lhfcws提到的那样,在流中没有像“所有消息”这样的概念。你可以做的一些事情(技巧)是: