kafka客户Api问题

时间:2016-12-29 11:14:13

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

任何人都可以帮助我解决以下问题。我正在使用 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()

1 个答案:

答案 0 :(得分:1)

1)您是否总是在消费者中使用相同的group.id?你在消费前生产吗?这可能与消费者群体和抵消管理有关。请参阅this answer about consumer offset behavior

2)不确定您是故意还是意外地阅读重复内容。只要消息由于主题保留策略而未被删除,您就可以再次阅读相同的消息以寻找该位置。如果你的意思是,auto-commit设置为false只意味着消费者不会为你提交偏移,你必须手动调用commitSync()或commitAsync()。在任何情况下,您的消费者仍有可能在提交之前处理消息并崩溃,在这种情况下,当消费者恢复时,它将再次读取那些已处理但未提交的消息。如果您只需要一次语义,则必须执行其他操作,例如以已处理的消息原子方式存储偏移量。

3)正如Lhfcws提到的那样,在流中没有像“所有消息”这样的概念。你可以做的一些事情(技巧)是:

  • 您可以检查轮询返回的记录列表是否为空,并在经过一些配置的次数后中断循环并退出。
  • 如果订购了消息(您正在从单个分区读取),您可以发送一种特殊的END_OF_DATA消息,当您看到它时,您将关闭消费者。
  • 您可以让消费者阅读许多消息然后退出,下次它将从上次提交的偏移量继续。