我的生产者可以创建一个主题,但似乎没有在经纪人内部存储任何数据。我可以检查是否使用#!/usr/bin/expect
spawn ssh user@host report
expect "Press ENTER to continue, or CTRL-C to quit."
send " \r"
expect "Press enter for inputing"
send "\r"
脚本创建了该主题。
当我尝试使用kafka-topics
消费时,它什么也没消费。 (我知道kafka-console-consumer
。)
当我使用--from-beginning
制作商品时,我的消费者(kafka-console-producer
)可以立即消费它。所以我的Java代码有问题。
当我使用kafka-console-consumer
运行代码时,它运行良好。当我使用使用者代码使用该主题时,它可以正常工作。我的生产者可以在本地计算机上使用Kafka服务器,但不能与远程计算机上的另一台Kafka服务器一起使用。
代码:
localhost:9092
我的CLI(腻子):
我想看到我的消费者在运行Java代码时正在消费。(图像中显示的数据来自生产者脚本。)
阅读答案和评论后,这是我到目前为止尝试过的。仍然不使用任何消息。我认为此代码中生成的消息未存储在代理中。我也尝试过使用其他服务器。同样的问题。主题已创建,但使用者组列表中不存在任何使用者,因此无法使用。消费者脚本不能消耗任何数据。
我还尝试了权限更改。 (小丑)并尝试使用etc / hosts文件。但没有运气。在解决此问题之前,我将继续尝试。
//this code is inside the main method
Properties properties = new Properties();
//properties.put("bootstrap.servers", "localhost:9092");
//When I used localhost, my consumer code consumes it fine.
properties.put("bootstrap.servers", "192.168.0.30:9092");
properties.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
properties.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
KafkaProducer<String, String> kafkaProducer = new KafkaProducer<String, String>(properties);
ProducerRecord<String, String> record = new ProducerRecord<>("test5", "1111","jin1111");
//topc is created, but consumer can't consume any data.
//I tried putting different values for key and value parameters but no avail.
try {
kafkaProducer.send(record);
System.out.println("complete");
} catch (Exception e) {
e.printStackTrace();
} finally {
kafkaProducer.close();
System.out.println("closed");
}
/*//try{
for(int i = 0; i < 10000; i++){
System.out.println(i);
kafkaProducer.send(new ProducerRecord("test", Integer.toString(i), "message - " + i ));
}*/
当我在Eclipse中运行此命令时,控制台显示:
答案 0 :(得分:2)
要完成ppatierno答案,应在调用KafkaProducer.close()之前调用KafkaProducer.flush()。这是一个阻塞的调用,在所有记录发送之前不会返回。
Yannick
答案 1 :(得分:1)
我的猜测是,在Kafka客户端发送消息之前,您的主要方法已经退出,应用程序结束了。
send
方法不同步。客户端缓冲消息并在达到名为linger time的超时(请参阅linger.ms)后将其发送,或者将缓冲区填充到特定大小(例如,请参见batch.size参数)。缺省情况下,延迟时间为0。
因此,您的主要方法所做的是将消息提供给send
方法,但随后退出,并且Kafka客户端中的基础线程无法发送消息。
答案 2 :(得分:0)
我终于明白了。如果您遇到类似的问题,则可以做一些事情。
在您的server.properties
中,取消注释,然后放置ip和port。
(端口似乎有问题,所以我更改了它。)
listeners=PLAINTEXT://192.168.0.30:9093
advertised.listeners=PLAINTEXT://192.168.0.30:9093
(在使用更改后的server.properties重新启动代理之前,您可能希望清除所有现有的log.dir
。如果无用,请尝试执行此操作)
您可能需要考虑的其他事项:
log.dir
。通常,默认路径为tmp
,但有时会有noexec
设置,因此请配置到其他位置etc/hosts
chown
和chmod
我工作的生产者代码:
public class Producer1 {
public static void main(String[] args){
Properties properties = new Properties();
properties.put("bootstrap.servers", "192.168.0.30:9093");
properties.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
properties.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
KafkaProducer<String, String> kafkaProducer = new KafkaProducer<String, String>(properties);
ProducerRecord<String, String> record = new ProducerRecord<>("test", "1","jin");
try {
kafkaProducer.send(record);
System.out.println("complete");
} catch (Exception e) {
e.printStackTrace();
} finally {
kafkaProducer.close();
System.out.println("closed");
}
}
}
有效的消费者代码:
public class Consumer1 {
public static void main(String[] args) {
Properties props = new Properties();
props.put("bootstrap.servers", "192.168.0.30:9093");
props.put("group.id", "jin");
props.put("auto.offset.reset", "earliest");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
KafkaConsumer<String, String> consumer = new KafkaConsumer<String, String>(props);
consumer.subscribe(Collections.singletonList("test"));
try {
while (true) {
ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(1000));
for (ConsumerRecord<String, String> record : records){
System.out.printf("offset = %d, key = %s, value = %s", record.offset(), record.key(), record.value());
}
}
} catch (Exception e){
e.printStackTrace();
} finally {
consumer.close();
System.out.println("closed");
}
}
}