![](/img/trans.png)
[英]Kafka consumer is not reading message sent by producer if started after producer
[英]Kafka: No message seen on console consumer after message sent by Java Producer
我是卡夫卡的新手。 我在我的本地機器上創建了一個java生成器,並在另一台機器上設置了一個Kafka代理,比如M2,在網絡上(我可以ping,SSH,連接到這台機器)。 在Eclipse控制台的Producer端,我收到“Message sent”。 但是,當我檢查機器M2上的控制台消費者時,我看不到這些消息。
我的java生產者代碼是:
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.clients.producer.ProducerRecord;
import java.util.HashMap;
import java.util.Map;
public class KafkaMessageProducer {
/**
* @param args
*/
public static void main(String[] args) {
KafkaMessageProducer reportObj = new KafkaMessageProducer();
reportObj.send();
}
public void send(){
Map<String, Object> config = new HashMap<String, Object>();
config.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "135.113.133.60:9092");
config.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
config.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
KafkaProducer<String, String> producer = new KafkaProducer<String, String>(config);
int maxMessages = 5;
int count = 0;
while(count < maxMessages){
producer.send(new ProducerRecord<String, String>("test", "msg", "message --- #"+count++));
System.out.println("Message send.."+count);
}
producer.close();
}
}
你能告訴我哪里出錯了嗎? 我可以從控制台生產者在機器M2上本地發送消息。 注意:即使我將IP地址更改為Kafka代理的完整主機名,它仍然存在同樣的問題。
更新:我還認為Producer能夠連接到Kafka代理並發送消息,但Kafka Broker不會將這些消息傳遞給消費者。 如果我將IP地址或端口更改為Zookeeper(與Kafka Broker在同一節點上運行),並查看Zookeeper的日志,它將獲取Producer ping,然后拒絕該會話。
Update2:我創建了一個Producer jar並在Machine M2上運行了這個jar,它運行起來了。 因此,生產者嘗試連接到Kafka代理的方式似乎有問題。 還不確定是什么問題。
我終於找到了答案,我在這里張貼以防其他人有同樣的問題。 在嘗試遠程連接時,請使用Kafka代理設置advertised.hostname。 這對我有用。
正如調試的想法 - 嘗試producer.send(/* record */).get();
也就是說,等待從send()
方法返回的Future
的結果。 可能是生產者方面有例外,它在后台被忽略了。
您可以嘗試使用以下代碼來讀取kafka主題的元數據信息,以查看代理是否收到了消息。 這可以幫助調試。
SimpleConsumer consumer = new SimpleConsumer(broker.host(), broker.port(), 100000,
64 * 1024, "your_group_id");
List<String> topics = new ArrayList<>();
topics.add(topic);
TopicMetadataRequest req = new TopicMetadataRequest(topics);
TopicMetadataResponse resp = simpleConsumer.send(req);
if (resp.topicsMetadata().size() != 1) {
throw new RuntimeException("Expected one metadata for topic "
+ topic + " found " + resp.topicsMetadata().size());
}
TopicMetadata topicMetaData = resp.topicsMetadata().get(0);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.