Я создаю Java API для Concet Kafka - PullRequest
0 голосов
/ 26 июня 2019

Я пишу Java API для создания kafka продюсер У меня ошибка:

Исключение в потоке "main" java.lang.NoSuchMethodError: org.apache.kafka.clients.producer.ProducerConfig (Ljava / Util / Свойства;). В по адресу 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 ]

3 голосов
/ 26 июня 2019

Это должно быть 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 голос
/ 26 июня 2019

Здесь:

java.lang.NoSuchMethodError:

Что всегда означает: некоторый класс хочет использовать что-то из другого класса, иво время выполнения этой другой вещи не существует.

Это всегда имеет одну и ту же основную причину: несовместимые уровни кода.Значение: вы запускаете libA в версии n, а libA использует libB.Теперь для libA необходима версия libB m , но из-за несогласованности настроек у вашей libB есть другая версия, которая не совместима с версией m .

Короче говоря: посмотрите, как вы настраиваете свои зависимости.Убедитесь, что они согласованы и отражают то, что kafka утверждает, что поддерживается.

0 голосов
/ 26 июня 2019

Ваш код вызывает конструктор 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 и т. Д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...