【问题标题】:Apache Kafka does not consume from apiApache Kafka 不使用 api
【发布时间】:2018-11-05 02:12:58
【问题描述】:

kafka-console-producer.sh 和 kafka-console-consumer.sh 的控制台命令运行正常,但是当我尝试使用 api 进行生产或消费时,我无法正常运行!谁能告诉我我的 scala 代码是否有问题?

import java.util.Properties

import org.apache.kafka.clients.producer.{KafkaProducer, ProducerRecord}

object ScalaProducerExample  {
  val topic = "test"
  val brokers = "<broker>:9092"
  val props = new Properties()
  props.put("bootstrap.servers", brokers)
  props.put("client.id", "ScalaProducerExample")
  props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer")
  props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer")
  val producer = new KafkaProducer[String, String](props)
  val data = new ProducerRecord[String, String](topic, "message")
  producer.send(data)
  producer.close()
}

这是 build.sbt 文件中加载的依赖项:

libraryDependencies += "org.apache.kafka" % "kafka-clients" % "0.8.2.1"

libraryDependencies += "org.apache.kafka" %% "kafka" % "0.10.2.0"

我什至用 Java 编写了它,并且正在发生同样的事情。

import org.apache.kafka.clients.ClientRequest;
import org.apache.kafka.clients.ClientResponse;
import org.apache.kafka.clients.KafkaClient;
import org.apache.kafka.clients.RequestCompletionHandler;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.common.Node;
import org.apache.kafka.common.requests.AbstractRequest;

import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import java.util.Random;

public class ProducerExample {
    public static void main(String[] args) {
        String topic = "test";
        String brokers = "<broker>:9092";
        System.out.println("init " );
        Properties props = new Properties();
        props.put("bootstrap.servers", brokers);
        props.put("acks", "all");
        props.put("retries", 0);
        props.put("batch.size", 16384);
        props.put("linger.ms", 1);
        props.put("buffer.memory", 33554432);


        props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

        System.out.println("creating prducer " );
        KafkaProducer<String, String> producer = new KafkaProducer<String, String>(props);
        producer.flush();
        producer.send(new ProducerRecord<>(topic, "1", "2"));
        producer.close();
        System.out.println("close  " );
    }
}

built.sbt 中的依赖有:

libraryDependencies += "org.apache.kafka" % "kafka-clients" % "0.8.2.1"

我知道连接可以正常工作,因为当我更改代理时,我收到了错误消息。但是当代理正确时,程序运行成功,但我没有收到任何消息。

更新:我假设程序成功运行的原因是它给出了超时。 我跑了这个

try {
            producer.send(new ProducerRecord<>(topic, "1", "2")).get(30, TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        }

得到了这个错误:

java.util.concurrent.TimeoutException: Timeout after waiting for 30000 ms.
        at org.apache.kafka.clients.producer.internals.FutureRecordMetadata.get(FutureRecordMetadata.java:64)
        at org.apache.kafka.clients.producer.internals.FutureRecordMetadata.get(FutureRecordMetadata.java:25)
        at de.innocow.kafka.ProducerExample.main(ProducerExample.java:45)

除此之外,我该如何调试并调查生产者不发送的原因?

【问题讨论】:

  • 你真的在运行旧版本的 Kafka 吗?

标签: java scala apache-kafka kafka-producer-api


【解决方案1】:
producer.send(new ProducerRecord<>(topic, "1", "2"));
producer.flush();            
producer.close();

试试这个,看看Docs

The flush() call gives a convenient way to ensure all previously sent messages have actually completed. 
 This example shows how to consume from one Kafka topic and produce to another Kafka topic:
 for(ConsumerRecord<String, String> record: consumer.poll(100))
     producer.send(new ProducerRecord("my-topic", record.key(), record.value());
 producer.flush();
 consumer.commit();

【讨论】:

  • 我测试了冲洗,但它不起作用。而且我没想到它实际上会起作用,因为我只是拥有所有新东西,所以没有以前的消息让我“确保所有以前发送的消息都已实际完成。”。问题是它在发送时卡住了,超时后它关闭了。我已经更新了这个问题。你能看看更新部分,如果你有任何解决方案,请给我建议。
猜你喜欢
  • 2021-08-22
  • 2016-12-10
  • 2021-01-14
  • 2021-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
  • 1970-01-01
相关资源
最近更新 更多