版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38038143/article/details/88813675
前言
上一篇博客介绍了如何安装Kafka,该篇将介绍如何在Java中创建生产者,并向Kafka写入数据。
环境:
Kafka 集群 + Eclipse + Kafka-2.1.1
1. 创建项目并配置依赖
注:博主目前还不会Maven 配置,因此所有依赖都是导入的JAR、ZIP包。
包下载:
链接:https://pan.baidu.com/s/12Ykei4-KmJ-eRTchI-7Z_g
提取码:6smg
创建项目,并添加依赖,如:
2. 编写程序
- 最简单的消息发送方式 – 发送并忘记
这种方式下,程序只管发送消息,而不关心是否消息正常到达。
SendMessageSimple.java
package producer_write;
import java.util.Properties;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;
/**
* @FileName: SendMessage1.java
* @Package: producer_write
* @Author: Gu Yongtao
* @Description: [文件描述]
*
* @Date: 2019年3月26日 上午9:03:32
*/
public class SendMessage1 {
public static void main(String[] args) {
// 创建生产者
Properties kafkaProps = new Properties();
// 指定broker(这里指定了2个,1个备用),如果你是集群更改主机名即可,如果不是只写运行的主机名
kafkaProps.put("bootstrap.servers", "slave1:9092,slave2:9092,slave3:9092");
kafkaProps.put("group.id", "CountryCounter"); // 消费者群组
// 设置序列化(自带的StringSerializer,如果消息的值为对象,就需要使用其他序列化方式,如Avro )
kafkaProps.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
kafkaProps.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
// 实例化出producer
KafkaProducer<String, String> producer = new KafkaProducer<String, String>(kafkaProps);
// 创建ProducerRecord对象
ProducerRecord<String, String> record = new ProducerRecord<String, String>("CustomerCountry",
"Hello", "Kafka");
try {
// 发送消息
producer.send(record);
} catch (Exception e) {
e.printStackTrace();
} finally {
producer.close();
}
}
}
运行程序:
查看是否发送成功到Kafka:
2. 同步发送消息 – 同步发送
使用send() 方法发送消息,会返回一个Future对象(可以从该对象中获取主题、分区、偏移量等信息),我们可以调用get() 方法进行等待,就可以知道消息是否成功发送。
SendMessageGet.jave
package producer_write;
......
public class SendMessageGet {
public static void main(String[] args) {
......(与上面代码相同)
// 创建ProducerRecord对象
ProducerRecord<String, String> record = new ProducerRecord<String, String>("CustomerCountry",
"Hello", "Kafka-Get");
try {
// 发送消息,调用get() 方法等待
producer.send(record).get();
} catch (Exception e) {
e.printStackTrace();
} finally {
producer.close();
}
}
}
查看主题消息:
3. 异步发送消息 – 异步发送
在调用send()方法时,指定一个回调函数,服务器在返回相应时调用该函数。
相比同步发送,异步发送不需要再等待服务器的消息回馈,而是通过一个回调函数,在回调函数内对消息发送失败进行处理(如:记录错误日志)。
SendMessageCallback.java
package producer_write;
import java.util.Properties;
import org.apache.kafka.clients.producer.Callback;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.clients.producer.RecordMetadata;
public class SendMessageCallback {
public static void main(String[] args) {
......(代码同上)
// 创建ProducerRecord对象
ProducerRecord<String, String> record = new ProducerRecord<String, String>("CustomerCountry",
"Hello", "Kafka-Callback");
try {
// 发送消息
SendMessageCallback sMCallback = new SendMessageCallback();
producer.send(record, sMCallback.new DemoProducerCallback());
} catch (Exception e) {
e.printStackTrace();
} finally {
producer.close();
}
}
private class DemoProducerCallback implements Callback {
@Override
public void onCompletion(RecordMetadata recordMetadata, Exception e) {
// TODO Auto-generated method stub
if (e != null) {
// 如果消息发送失败,打印异常
e.printStackTrace();
} else {
System.out.println("成功发送消息!");
}
}
}
}
查看主题消息: