我正在创建Java API来连接卡夫卡

时间:2019-06-26 12:13:19

标签: java apache-kafka

我正在编写Java API以创建kafka生产者 我有一个错误:

  

线程“主”中的异常java.lang.NoSuchMethodError:   org.apache.kafka.clients.producer.ProducerConfig。(Ljava / util / Properties;)V     在in.co.hadooptutorials.data.generator.cdr.kafka.main(kafka.java:65)

下面是我的代码

public class kafka {

public static void main(String[] args) throws IOException {
 String TOPIC_NAME = "test";
    String objec ="hello";

    Properties props=new Properties();
    props.put("bootstrap-server", "localhost:9092");
    props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
    props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
    ProducerConfig config = new ProducerConfig(props);
    System.out.println("confing work.");
    KafkaProducer<String,String> sampleProducer= new KafkaProducer<String,String>(props);

    ProducerRecord<String, String> record = new ProducerRecord<String, String>(TOPIC_NAME,objec);        
    sampleProducer.send(record);

    sampleProducer.close();
    System.out.println("SimpleProducer Completed.");

}
}

如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

应为bootstrap.servers,而不是bootstrap-server

在设置配置时,最好使用org.apache.kafka.clients.producer.ProducerConfig。例如:

    configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9090");
    configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);

答案 1 :(得分:1)

这里:

  

java.lang.NoSuchMethodError:

总是 的意思是:某个类想要使用另一个类中的某些内容,而在运行时,其他内容不存在。

这始终是相同的根本原因:不兼容的代码级别。含义:您正在版本n中运行libA,而libA使用libB。现在,libA需要libB的版本为 m ,但是由于设置不一致,您的libB的不同版本与 m 。

长话短说:研究设置依赖项的方式。确保它们是一致的,并反映kafka声称支持的内容。

答案 2 :(得分:0)

您的代码调用ProducerConfig的构造函数:

ProducerConfig config = new ProducerConfig(props);

在运行时,您会看到一条错误消息,指出该方法不存在。在1.0.2版之前的版本中定义的构造函数不支持传递Properties对象。 (https://github.com/apache/kafka/blob/1.0.2/clients/src/main/java/org/apache/kafka/clients/producer/ProducerConfig.java#L360-L366)。

ProducerConfig(Map<?, ?> props) {
    super(CONFIG, props);
}

ProducerConfig(Map<?, ?> props, boolean doLog) {
    super(CONFIG, props, doLog);
}

请注意,在1.1.0版中,添加了这样的构造函数:https://github.com/apache/kafka/blob/1.1.0/clients/src/main/java/org/apache/kafka/clients/producer/ProducerConfig.java#L364-L366

public ProducerConfig(Properties props) {
    super(CONFIG, props);
}

您的代码可以编译的事实表明,可以在编译时找到合适的库版本。但是,在运行时找不到合适的版本(这意味着在运行时您可能会链接到不支持此方法的旧版本)。

解决方案是在编译时和运行时检查您所包含的Kafka库的版本,具体取决于构建项目的方式(例如通过Maven,Gradle等)。