kafka(java客戶端)消費者取不到消息,生產者消息也沒發送成功
先說下我使用的各種版本:
kafka版本:kafka_2.12-1.0.0
zookeeper版本:3.4.11
pom中使用的客戶端版本:0.11.0.0
在Ubuntu虛擬機上安裝了kafka,zookeepe之后,沒有修改過其中的任何配置文件,kafka默認端口是9029,zookeeper默認端口是2181,
分別運行以下兩個命令,他兩都能正常運行:
zookeeper-server-start.sh config/zookeeper.properties
kafka-server-start.sh config/server.properties
1
2
3
啟動后,創建Topic:
kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic topic1
1
然后問題就來了
通過命令行工具(kafka-console-producer.sh和kafka-console-consumer.sh)是能夠相互通信的,producer發布的信息consumer能夠接收到。
但是
java通過kafka-client的API寫的代碼始終不能跟kafka通信:java producer的消息發不出去, java comsumer也收不到任何消息。
仔細檢查了下代碼中IP、端口都沒有寫錯。
解決辦法
將kafka/config/server.properties文件中advertised.listeners改為如下屬性。192.168.75.137是我虛擬機的IP。改完后重啟,OK了。Java端的代碼終於能通信了
advertised.listeners=PLAINTEXT://192.168.75.137:9092
advertised.listeners上的注釋是這樣的:
#Hostname and port the broker will advertise to producers and consumers. If not set,
# it uses the value for "listeners" if configured. Otherwise, it will use the value
# returned from java.net.InetAddress.getCanonicalHostName().
1
2
3
意思就是說:hostname、port都會廣播給producer、consumer。如果你沒有配置了這個屬性的話,則使用listeners的值,如果listeners的值也沒有配置的話,則使用
java.net.InetAddress.getCanonicalHostName()返回值(這里也就是返回localhost了)。