kafka从java应用程序生成并发送消息并在cli中使用

时间:2016-06-08 17:40:42

标签: java apache-kafka kafka-consumer-api kafka-producer-api

我是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

以上命令不显示任何内容,没有错误,没有输出。

我哪里出错了?

1 个答案:

答案 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.12advertised.host.name=192.168.10.13advertised.host.name=192.168.10.14