最近,我们使用flink使用正则表达式模式使用kafka主题。发现当我们删除一些未使用的主题时,日志将继续刷新UNKNOWN_TOPIC_EXCEPTION。
我研究了kafka客户端的源代码,发现对于消费者而言,metadata中的topicExpiry被禁用,这导致即使删除了该主题,客户端仍在元数据的主题列表中保留该主题信息,并继续获取从服务器。
有没有什么好的方法可以避免在不修改kafka源代码的情况下出现此烦人的警告日志? (我们仍然需要“真实”未知主题例外,这意味着在日志中不是过时的主题)
以下代码可用于重现此问题(如果您在kafka集群中创建多个主题,例如“ test1”,“ test2”,“ test3” ...“ testn”,然后在运行时删除其中任何一个) 。
public static void main(String [] args) {
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092\n");
props.put("group.id", "test10");
props.put("enable.auto.commit", "true");
props.put("auto.commit.interval.ms", "1000");
props.put("auto.offset.reset", "earliest");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("metadata.max.age.ms", "60000");
KafkaConsumer<String, String> consumer = new KafkaConsumer<String, String>(props);
class PartitionOffsetAssignerListener implements ConsumerRebalanceListener {
private KafkaConsumer<String, String> consumer;
public PartitionOffsetAssignerListener(KafkaConsumer kafkaConsumer) {
this.consumer = kafkaConsumer;
}
public void onPartitionsRevoked(Collection<TopicPartition> partitions) {
}
public void onPartitionsAssigned(Collection<TopicPartition> partitions) {
//reading all partitions from the beginning
consumer.seekToBeginning(partitions);
}
}
consumer.subscribe(Pattern.compile("^test.*$"), new PartitionOffsetAssignerListener(consumer));
while (true) {
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());
}
}
}