我正在编写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.");
}
}
如何解决这个问题?
答案 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等)。