java KafkaConsumer永远不会得到结果

时间:2018-08-29 14:58:18

标签: apache-kafka kafka-consumer-api

我是kafka的新手,我有以下示例代码:

KafkaConsumer<String,String> kc = new KafkaConsumer<String, String>(props);
while(true) {
    List<String> topicNames = Arrays.asList(topics.split(","));
    if (!kc.assignment().isEmpty()) {
        kc.unsubscribe();
    }
    kc.subscribe(topicNames);
    ConsumerRecords<String, String> recv = kc.poll(1000L);
    if (!recv.isEmpty()) {
        System.out.println("NOT EMPTY");
    }
}

recv始终为空,但是如果我尝试增加池超时,则记录也将返回,并且如果我切断了取消订阅的部分。

我已经从集成专有软件中获取了这段代码,我无法对其进行修改。

所以我的问题是:这仅仅是时间问题还是更多?

2 个答案:

答案 0 :(得分:0)

您一开始只能订阅一次主题。像这样:

 final KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
 consumer.subscribe(Arrays.asList("foo", "bar"));

 while (true) {
     final ConsumerRecords<String, String> records = consumer.poll(100);
     for (ConsumerRecord<String, String> record : records)
         System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());
 }

答案 1 :(得分:0)

当消费者(重新)订阅某个主题时,会发生很多事情。

据我所知,消费者大致可以这样:

  • 请求集群信息
  • 请求消费者组元数据
  • 发出JOIN_GROUP请求
  • 被分配某些分区

如果同一组中有更多消费者,则底层机制甚至更加复杂。这是因为应该在组内的所有使用者之间重新分配分区。

这就是为什么:

  • 1000毫秒可能还不够,您没有及时轮询任何东西
  • 当您增加超时时间时,您轮询了某些内容,因为Kafka设法执行了所有这些引导操作
  • 当您取消取消对主题的订阅时,您轮询了某些内容,因为您的消费者很可能已经订阅了

因此存在计时问题。而且我认为还有更多东西-在无限循环中取消/订阅主题对我来说毫无意义(请参阅其他答案)。