我是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始终为空,但是如果我尝试增加池超时,则记录也将返回,并且如果我切断了取消订阅的部分。
我已经从集成专有软件中获取了这段代码,我无法对其进行修改。
所以我的问题是:这仅仅是时间问题还是更多?
答案 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)
当消费者(重新)订阅某个主题时,会发生很多事情。
据我所知,消费者大致可以这样:
如果同一组中有更多消费者,则底层机制甚至更加复杂。这是因为应该在组内的所有使用者之间重新分配分区。
这就是为什么:
因此存在计时问题。而且我认为还有更多东西-在无限循环中取消/订阅主题对我来说毫无意义(请参阅其他答案)。