生产者.send()和生产者.send().get()
来源:5-1 Producer章节介绍
乃好
2020-05-26
老师您好,我编写了一个客户端,生产者发送数据,并且服务器上使用bin/kafka-console-consumer.sh命令,观察是否有数据过来,发现了一个奇怪的现象
下面是我的代码:
package com.gx.kafkastudy.掘金.生产者;
import org.apache.kafka.clients.producer.*;
import org.apache.kafka.common.serialization.StringSerializer;
import java.util.Properties;
import java.util.concurrent.Future;
public class KafkaProducerAnalysis
{
public static final String brokerList = "192.168.1.191:9092,192.168.1.65:9092,192.168.1.82:9092";
public static final String topic = "topic-demo";
public static Properties initConfig()
{
Properties pros = new Properties();
pros.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, brokerList);
pros.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
pros.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
pros.put(ProducerConfig.CLIENT_ID_CONFIG, "producer.client.id.demo");
pros.put(ProducerConfig.RETRIES_CONFIG, 10);
return pros;
}
public static void main(String[] args)
{
Properties pros = initConfig();
KafkaProducer<String, String> producer = new KafkaProducer<String, String>(pros);
ProducerRecord<String, String> record = new ProducerRecord<>(topic, "Hello, Kafka!");
try
{
//这样写,消费者接收不到数据
producer.send(record);
//这样写,消费者也接收不到数据
producer.send(record, new Callback()
{
@Override
public void onCompletion(RecordMetadata recordMetadata, Exception e)
{
//并且也打印不出任何内容
System.out.println(recordMetadata.topic());
}
});
//这样写,消费者可以接收到数据
producer.send(record).get();
//这样写,消费者也可以接收到数据
Future<RecordMetadata> future = producer.send(record);
RecordMetadata recordMetadata = future.get();
//这样写,消费者也可以接收到数据
producer.send(record, new Callback()
{
@Override
public void onCompletion(RecordMetadata recordMetadata, Exception e)
{
//也可以打印出内容
System.out.println(recordMetadata.topic());
}
}).get();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}一开始我使用的是send,但是发现并没有数据得到,后来又加了一个get,可以得到了,经过我的反复测试,还真是这样,唯一的区别就是后面有没有get方法,按理说这不影响消息的发送呀,get只是可以获取发送出去的数据而已,这是什么原因呢?
写回答
1回答
-
Allen
2020-05-26
你只不过把异步变同步了, 把Producer的配置按照课程里的内容配置一下, 异步就能收到了
122020-05-26
相似问题