我遇到了错误:
org.apache.kafka.common.errors.TimeoutException: Topic testtopic2 not present in metadata after 60000 ms.
当尝试使用Java在Windows上的本地kafka实例中生成主题时。请注意,主题testtopic2存在,并且我可以使用Windows控制台生产器向它生成消息。
在我正在使用的代码下面:
import java.util.Properties;
import org.apache.kafka.clients.CommonClientConfigs;
import org.apache.kafka.clients.producer.Callback;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.clients.producer.RecordMetadata;
public class Kafka_Producer {
public static void main(String[] args){
Properties props = new Properties();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
props.put(ProducerConfig.ACKS_CONFIG, "all");
props.put(ProducerConfig.RETRIES_CONFIG, 0);
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
Producer<String, String> producer = new KafkaProducer<String, String>(props);
TestCallback callback = new TestCallback();
for (long i = 0; i < 100 ; i++) {
ProducerRecord<String, String> data = new ProducerRecord<String, String>(
"testtopic2", "key-" + i, "message-"+i );
producer.send(data, callback);
}
producer.close();
}
private static class TestCallback implements Callback {
@Override
public void onCompletion(RecordMetadata recordMetadata, Exception e) {
if (e != null) {
System.out.println("Error while producing message to topic :" + recordMetadata);
e.printStackTrace();
} else {
String message = String.format("sent message to topic:%s partition:%s offset:%s", recordMetadata.topic(), recordMetadata.partition(), recordMetadata.offset());
System.out.println(message);
}
}
}
}
Pom依赖项:
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>2.6.0</version>
</dependency>
答案 0 :(得分:9)
我今天也遇到同样的问题。我是Kafka的新手,只是想让示例Java生产者和使用者运行。我能够使使用者正常工作,但是与制作人一样,仍然收到与您相同的“主题不在元数据中出现”错误。
最后,出于绝望,我向生产者添加了一些代码以转储主题。当我这样做时,由于缺少包jackson-databind和jackson-core中的类,因此我遇到了运行时错误。添加它们之后,我不再遇到“主题不存在”错误。我删除了我临时添加的主题转储代码,它仍然有效。
答案 1 :(得分:2)
首先,我要感谢Bobb Dobbs的回答,今天我也为此付出了一段时间。我只想补充一点,我必须添加的唯一依赖项是jackson-databind
。除了kafka-clients
之外,这是我项目中唯一的依赖项。
更新:我对所发生的事情了解得更多。 kafka-clients
将其jackson-databind
依赖项的范围设置为“已提供”,这意味着它希望JDK或容器在运行时提供它。有关提供的Maven范围的更多详细信息,请参见this article。
此作用域用于标记在运行时应由JDK或容器提供的依赖项,因此也称为名称。 这种范围的一个好用例是在某个容器中部署的Web应用程序,其中该容器本身已经提供了一些库。
我不确定将其范围设置为提供的确切理由,只是人们通常希望自己提供该库以使其保持最新版本以进行安全修复,等等。
答案 2 :(得分:0)
我创建了一个具有单个分区的主题,并试图将该主题填充到10个分区中。而且我遇到了这个问题。
我使用kafka-topics.sh脚本删除了该主题,但没有等待很长时间即可完成清理。我开始填充主题。当我查看主题元数据时,它具有一个分区,并且遇到了与该答案第一部分中提到的完全相同的问题。
答案 3 :(得分:0)
您可能要检查生产者属性中的metadata.max.idle.ms
生产者缓存的元数据的时间长于上面配置的值。经纪人端对meta所做的任何更改都不会立即在客户端(生产者)上提供。但是,重新启动生产者时,应在启动时阅读元数据。
更新:在此处检查默认值。https://kafka.apache.org/25/documentation.html#metadata.max.idle.ms
答案 4 :(得分:0)
我也遇到了类似的问题,当时我在 macbook 上的本地环境中尝试了此操作。这很令人沮丧,我尝试了几种方法
我在生产中使用 Kafka 已经 3 年多了,但是在集群上没有遇到这个问题,只发生在我本地环境中。但是,重新启动为我修复了它。
答案 5 :(得分:0)
此错误也可能是由于目标 Kafka 实例“死亡”或 URL 错误而出现的。
在这种情况下,向 Kafka 发送消息的线程将在 max.block.ms
时间被阻塞,默认为 60000 毫秒。
您可以通过传递更改的值来检查是否是由于上述属性:
Properties props = new Properties();
...(among others)
props.put(ProducerConfig.MAX_BLOCK_MS_CONFIG, 30000); # 30 sec or any other value of your choice
如果 TimeoutException
在你指定的时间后抛出,那么你应该检查你的 Kafka URL 是否正确或 Kafka 实例是否存活。
答案 6 :(得分:0)
请注意,这也可能发生,因为 kafka-client 和 Spring 的版本不兼容
https://spring.io/projects/spring-kafka“Kafka 客户端兼容性”矩阵中的更多信息