Java 卡夫卡制作人似乎工作不正常

Java 卡夫卡制作人似乎工作不正常,java,apache-kafka,kafka-producer-api,Java,Apache Kafka,Kafka Producer Api,我有一个用Java编写的卡夫卡制作人。尽管它基本上是一个简单的示例代码,但它似乎并不正确。我希望输出10条消息到我的集群。相反,我得到了消息successfully output,但实际上没有任何东西进入集群。我不确定从哪里开始故障排除 import java.util.Properties; import org.apache.kafka.clients.producer.Producer; import org.apache.kafka.clients.producer.KafkaProdu

我有一个用Java编写的卡夫卡制作人。尽管它基本上是一个简单的示例代码,但它似乎并不正确。我希望输出10条消息到我的集群。相反,我得到了消息successfully output,但实际上没有任何东西进入集群。我不确定从哪里开始故障排除

import java.util.Properties;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;

public class SimpleProducer {

 public static void main(String[] args) throws Exception{

    String topicName = "test_topic";
    Properties props = new Properties();
    props.put("bootstrap.servers", "skynet.local:6667");    
    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");

    Producer<String, String> producer = new KafkaProducer<String, String>(props);

    for(int i = 0; i < 10; i++)
       producer.send(new ProducerRecord<String, String>(topicName, Integer.toString(i), Integer.toString(i)));
       System.out.println("Message sent successfully");
       producer.close();
 }
}
import java.util.Properties;
导入org.apache.kafka.clients.producer.producer;
导入org.apache.kafka.clients.producer.KafkaProducer;
导入org.apache.kafka.clients.producer.ProducerRecord;
公共类SimpleProducer{
公共静态void main(字符串[]args)引发异常{
字符串topicName=“测试主题”;
Properties props=新属性();
道具放置(“bootstrap.servers”,“skynet.local:6667”);
道具放置(“阿克斯”、“全部”);
道具放置(“重试”,0);
道具放置(“批量大小”,16384);
道具放置(“玲儿小姐”,1);
props.put(“buffer.memory”,33554432);
put(“key.serializer”、“org.apache.kafka.common.serialization.StringSerializer”);
put(“value.serializer”、“org.apache.kafka.common.serialization.StringSerializer”);
制作人=新卡夫卡制作人(道具);
对于(int i=0;i<10;i++)
producer.send(新的ProducerRecord(topicName、Integer.toString(i)、Integer.toString(i));
System.out.println(“消息发送成功”);
producer.close();
}
}

由于某些环境尚未清理,因此我将尝试回答您的问题,因为您的Kafka服务器已经在端口6667上工作

您的代码可能需要在2个位置进行调整(有人可以帮助我改进):

在这里,放下
producer.close()
循环,代码>超出

 Producer<String, String> producer = new KafkaProducer<String, String>(props, new StringSerializer(), new StringSerializer());
 for(int i = 0; i < 10; i++) {
   Future<RecordMetadata> f = producer.send(new ProducerRecord<String, String>(topicName, Integer.toString(i), Integer.toString(i)));
   System.out.println(f.get()); // don't do that in your Production, here just for debugging purpose.
 }
 producer.close();
Producer-Producer=new-KafkaProducer(props,new-StringSerializer(),new-StringSerializer());
对于(int i=0;i<10;i++){
Future f=producer.send(新ProducerRecord(topicName,Integer.toString(i),Integer.toString(i));
System.out.println(f.get());//不要在产品中这样做,这里只是为了调试目的。
}
producer.close();

还有一件事,您可以在测试之前运行
kafka console consumer.sh
kafka console producer.sh
,以确认您的kafka服务器和SimpleProducer已经在工作。发送时的Kafka 0.10.x配置参数是一个异步调用,因此请尝试在打印消息之前等待返回的将来。更好的是,您可以打印未来以进行调试。我还建议测试时acks等于1,所以我将acks设置为1,并将屏幕输出全部注释掉。它仍然需要很长时间才能运行,并且似乎没有发出任何消息。这有关系吗?我将此标记为答案,因为事实证明是的,关闭制作人确实需要移出循环,但我还需要更新我的主机文件,以便IPs能够解析。谢谢@BobWakefield和
newkafkaproducer(props,newstringserializer(),newstringserializer())
将序列化程序添加到KafkaProducer构造函数可能更好。
 Producer<String, String> producer = new KafkaProducer<String, String>(props, new StringSerializer(), new StringSerializer());
 for(int i = 0; i < 10; i++) {
   Future<RecordMetadata> f = producer.send(new ProducerRecord<String, String>(topicName, Integer.toString(i), Integer.toString(i)));
   System.out.println(f.get()); // don't do that in your Production, here just for debugging purpose.
 }
 producer.close();