03-Kafka生产者--向Kafka写入数据(Java)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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. 编写程序

  1. 最简单的消息发送方式 – 发送并忘记
    这种方式下,程序只管发送消息,而不关心是否消息正常到达。
    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("成功发送消息!");
			}
		}

	}
}

查看主题消息:
在这里插入图片描述
在这里插入图片描述

下一篇博客将介绍如何使用Avro 序列化消息。
链接:https://blog.csdn.net/qq_38038143/article/details/88823740

完!

猜你喜欢

转载自blog.csdn.net/qq_38038143/article/details/88813675
今日推荐