Kafka:Java Producer

时间:2016-05-22 04:12:06

标签: java apache-kafka

我是卡夫卡的新手。我在我的本地机器上创建了一个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代理的方式似乎有问题。还不确定是什么问题。

3 个答案:

答案 0 :(得分:4)

我终于找到了答案,我在这里张贴以防其他人有同样的问题。在尝试远程连接时,请使用Kafka代理设置advertised.hostname。这对我有用。

答案 1 :(得分:2)

就像调试一样 - 尝试producer.send(/* record */).get(); 也就是说,等待Future方法返回的send()的结果。可能是生产者方面有例外,它在后台被忽略了。

答案 2 :(得分:1)

您可以尝试使用以下代码来读取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);