1、maven包
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>2.4.1</version>
</dependency>
2、生产者代码
package cn.itcast.kafka;
import org.apache.kafka.clients.Metadata;
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;
import java.util.Properties;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
/**
* kafka的生产者程序
* 会将消息创建出来,并发送到kafka集群中
*/
public class KafkaProducerTest {
public static void main(String[] args) throws ExecutionException, InterruptedException {
//1、创建用于连接kafka的properties配置
Properties conf = new Properties();
//kafka服务器地址
conf.put("bootstrap.servers", "192.168.30.1:9021");
//表示当生产者数据到kafka中,kafka中会以什么样的策返回
conf.put("acks", "all");
//kafka中的消息是以key、value键值对储存的,而且生产者生产的消息是需要在网络上传导的,这里指定的是StringSerializer方式,也就是字符串方式发送
conf.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
//同上
conf.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
//2、创建一个生产者对象kafkaProducer
KafkaProducer<Object, Object> kafkaProducer = new KafkaProducer<>(conf);
//3、发送1-100的消息到指定的topic
for (int i = 0; i < 100; i++) {
//构建一条消息,直接new ProducerRecord
ProducerRecord<Object, Object> producerRecord = new ProducerRecord<>("test", null, i + "");
//使用同步等待的方式发送消息
/*
Future<RecordMetadata> future = kafkaProducer.send(producerRecord);
//调用future的get方法等待响应
future.get();
System.out.println("第"+ i + "条消息写入成功");
*/
/*
使用异步回调的方式发送消息
使用匿名内部类实现callback接口,该接口中标识kafka服务器响应给客户端,会调用onCompletion方法
recordMetadata:消息的元数据(属于哪个topic、partition,对应的offset是什么)
e:这个对象kafka生产消息封装了出现的异常,如果为null,表示发送成功,反之出现异常
*/
kafkaProducer.send(producerRecord, new Callback() {
@Override
public void onCompletion(RecordMetadata recordMetadata, Exception e) {
//1、判断消息是否发送成功
if(e == null){
//发送成功
//主题
String topic = recordMetadata.topic();
//分区
int partition = recordMetadata.partition();
//偏移量
long offset = recordMetadata.offset();
System.out.println("topic:" + topic + "分区id:" + partition + "偏移量:" + offset);
}else {
//发送出现错误
System.out.println("生产消息出现异常");
//打印异常消息
System.out.println(e.getMessage());
//打印调用栈
System.out.println(e.getStackTrace());
}
}
});
}
//4、关闭生产者
kafkaProducer.close();
}
}