我是kafka的新手。我试图通过Java应用程序发送消息并在命令行提示符中使用它,但消息未在CLI上显示。
以下是java代码:
package com.kafka.prj;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Properties;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.clients.producer.KafkaProducer;
public class KafkaProd {
private static KafkaProducer<String, String> producer;
public void initialize() {
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
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");
// ProducerConfig producerConfig = new ProducerConfig(producerProps);
producer = new KafkaProducer<String, String>(props);
}
public void publishMesssage() throws Exception{
producer.send(new ProducerRecord<String, String>("test1", "dummy text msg"));
return;
}
public static void main(String[] args) {
KafkaProd kafkaProducer = new KafkaProd();
// Initialize producer
kafkaProducer.initialize();
// Publish message
try {
kafkaProducer.publishMesssage();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//Close the producer
producer.close();
}
}
在CLI中,以下是用于使用上述代码中发送的消息的命令:
$ bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic test1 --from-beginning
以上命令不显示任何内容,没有错误,没有输出。
我哪里出错了?
答案 0 :(得分:0)
我遇到了同样的问题,即kafka-console-producer.sh生成的消息在kafka-console-consumer.sh控制台上可见。但是,在使用Java生产者时,kafka-console-consumer.sh控制台没有收到任何消息。此外,Java生产者的日志将此作为最后一行:
2017-07-10 16:36:42 INFO KafkaProducer:972 - Closing the Kafka producer with timeoutMillis = 9223372036854775807 ms.
这意味着Java生产者无法连接到Java生成器上的bootstrap.servers
配置所给出的Kafka代理。 (虽然,我实际上能够从与Java生产者相同的机器远程登录到代理端口)。解决方案是在所有代理上添加属性:advertised.host.name
。并使其等于代理的IP /主机名。这应该与您在bootstrap.servers
中提供的任何内容一致。
我的bootstrap.servers
的值为192.168.10.12:9092,192.168.10.13:9092,192.168.10.14:9092
,因此在每个代理上,我分别advertised.host.name=192.168.10.12
,advertised.host.name=192.168.10.13
和advertised.host.name=192.168.10.14
。