簡體   English   中英

Kafka:Java 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM