基于kafka_2.11-2.1.0实现的生产者和消费者代码样例

基于kafka_2.11-2.1.0实现的生产者和消费者代码样例

1、搭建部署好zookeeper集群和kafka集群,这里省略。

1 启动zk:
2 bin/zkServer.sh start conf/zoo.cfg。
3 验证zk是否启动成功:
4 bin/zkServer.sh status conf/zoo.cfg。
5 启动kafka:
6 bin/kafka-server-start.sh -daemon config/server.properties。

2、生产者和消费者代码如下所示:

 1 package com.bie.kafka.producer;
 2 
 3 import java.util.Properties;
 4 
 5 import org.apache.kafka.clients.producer.KafkaProducer;
 6 import org.apache.kafka.clients.producer.Producer;
 7 //import org.apache.kafka.clients.producer.ProducerConfig;
 8 import org.apache.kafka.clients.producer.ProducerRecord;
 9 
10 /**
11  * 
12  * @Description TODO
13  * @author biehl
14  * @Date 2019年4月6日 上午11:27:34
15  *
16  */
17 public class ProducerTest {
18 
19     public static void main(String[] args) {
20         // 构造一个java.util.Properties对象
21         Properties props = new Properties();
22         // 指定bootstrap.servers属性。必填,无默认值。用于创建向kafka broker服务器的连接。
23         props.put("bootstrap.servers", "192.168.110.130:9092,192.168.110.131:9092,192.168.110.132:9092");
24         // 指定key.serializer属性。必填,无默认值。被发送到broker端的任何消息的格式都必须是字节数组。
25         // 因此消息的各个组件都必须首先做序列化,然后才能发送到broker。该参数就是为消息的key做序列化只用的。
26         props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
27         // 指定value.serializer属性。必填,无默认值。和key.serializer类似。此被用来对消息体即消息value部分做序列化。
28         // 将消息value部分转换成字节数组。
29         props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
30         //acks参数用于控制producer生产消息的持久性(durability)。参数可选值,0、1、-1(all)。
31         props.put("acks", "-1");
32         //props.put(ProducerConfig.ACKS_CONFIG, "1");
33         //在producer内部自动实现了消息重新发送。默认值0代表不进行重试。
34         props.put("retries", 3);
35         //props.put(ProducerConfig.RETRIES_CONFIG, 3);
36         //调优producer吞吐量和延时性能指标都有非常重要作用。默认值16384即16KB。
37         props.put("batch.size", 323840);
38         //props.put(ProducerConfig.BATCH_SIZE_CONFIG, 323840);
39         //控制消息发送延时行为的,该参数默认值是0。表示消息需要被立即发送,无须关系batch是否被填满。
40         props.put("linger.ms", 10);
41         //props.put(ProducerConfig.LINGER_MS_CONFIG, 10);
42         //指定了producer端用于缓存消息的缓冲区的大小,单位是字节,默认值是33554432即32M。
43         props.put("buffer.memory", 33554432);
44         //props.put(ProducerConfig.BUFFER_MEMORY_CONFIG, 33554432);
45         props.put("max.block.ms", 3000);
46         //props.put(ProducerConfig.MAX_BLOCK_MS_CONFIG, 3000);
47         //设置producer段是否压缩消息,默认值是none。即不压缩消息。GZIP、Snappy、LZ4
48         //props.put("compression.type", "none");
49         //props.put(ProducerConfig.COMPRESSION_TYPE_CONFIG, "none");
50         //该参数用于控制producer发送请求的大小。producer端能够发送的最大消息大小。
51         //props.put("max.request.size", 10485760);
52         //props.put(ProducerConfig.MAX_REQUEST_SIZE_CONFIG, 10485760);
53         //producer发送请求给broker后,broker需要在规定时间范围内将处理结果返还给producer。默认30s
54         //props.put("request.timeout.ms", 60000);
55         //props.put(ProducerConfig.REQUEST_TIMEOUT_MS_CONFIG, 60000);
56         
57         
58         // 使用上面创建的Properties对象构造KafkaProducer对象
59         //如果采用这种方式创建producer,那么就不需要显示的在Properties中指定key和value序列化类了呢。
60         // Serializer keySerializer = new StringSerializer();
61         // Serializer valueSerializer = new StringSerializer();
62         // Producer producer = new KafkaProducer(props,
63         // keySerializer, valueSerializer);
64         Producer producer = new KafkaProducer<>(props);
65         for (int i = 0; i < 100; i++) {
66             //构造好kafkaProducer实例以后,下一步就是构造消息实例。
67              producer.send(new ProducerRecord<>("topic1", Integer.toString(i), Integer.toString(i)));
68             // 构造待发送的消息对象ProduceRecord的对象,指定消息要发送到的topic主题,分区以及对应的key和value键值对。
69             // 注意,分区和key信息可以不用指定,由kafka自行确定目标分区。
70             //ProducerRecord producerRecord = new ProducerRecord("my-topic",
71             //        Integer.toString(i), Integer.toString(i));
72             // 调用kafkaProduce的send方法发送消息
73             //producer.send(producerRecord);
74         }
75         System.out.println("消息生产结束......");
76         // 关闭kafkaProduce对象
77         producer.close();
78         System.out.println("关闭生产者......");
79     }
80 
81 }

消费者代码如下所示:

 1 package com.bie.kafka.consumer;
 2 
 3 import java.util.Arrays;
 4 import java.util.Properties;
 5 
 6 import org.apache.kafka.clients.consumer.ConsumerRecord;
 7 import org.apache.kafka.clients.consumer.ConsumerRecords;
 8 import org.apache.kafka.clients.consumer.KafkaConsumer;
 9 
10 /**
11  * 
12  * @Description TODO
13  * @author biehl
14  * @Date 2019年4月6日 下午8:12:28
15  *
16  */
17 public class ConsumerTest {
18 
19     public static void main(String[] args) {
20         String topicName = "topic1";
21         String groupId = "group1";
22         //构造java.util.Properties对象
23         Properties props = new Properties();
24         // 必须指定属性。
25         props.put("bootstrap.servers", "192.168.110.130:9092,192.168.110.131:9092,192.168.110.132:9092");
26         // 必须指定属性。
27         props.put("group.id", groupId);
28         props.put("enable.auto.commit", "true");
29         props.put("auto.commit.interval.ms", "1000");
30         // 从最早的消息开始读取
31         props.put("auto.offset.reset", "earliest");
32         // 必须指定
33         props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
34         // 必须指定
35         props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
36 
37         // 使用创建的Properties实例构造consumer实例
38         KafkaConsumer consumer = new KafkaConsumer(props);
39         // 订阅topic。调用kafkaConsumer.subscribe方法订阅consumer group所需的topic列表
40         consumer.subscribe(Arrays.asList(topicName));
41         try {
42             while (true) {
43                 //循环调用kafkaConsumer.poll方法获取封装在ConsumerRecord的topic消息。
44                 ConsumerRecords records = consumer.poll(1000);
45                 //获取到封装在ConsumerRecords消息以后,处理获取到ConsumerRecord对象。
46                 for (ConsumerRecord record : records) {
47                     //简单的打印输出
48                     System.out.println(
49                             "offset = " + record.offset() 
50                             + ",key = " + record.key() 
51                             + ",value =" + record.value());
52                 }
53             }
54         } catch (Exception e) {
55             //关闭kafkaConsumer
56             System.out.println("消息消费结束......");
57             consumer.close();
58         }
59         System.out.println("关闭消费者......");
60     }
61 }

遇到的坑,一开始报的错误莫名其妙,一开始以为使用的jar包版本问题,又是报slf4j的错误,又是报log4j的错误,又是报空指针的异常。最后百度意外遇到了可能是本地没有将ip地址放到hosts文件里面,果然是这个问题。

基于kafka_2.11-2.1.0实现的生产者和消费者代码样例_第1张图片

添加如下所示即可:

基于kafka_2.11-2.1.0实现的生产者和消费者代码样例_第2张图片

然后就可以开心的生产消息和消费消息了啊。开心。

项目结构如下所示:

基于kafka_2.11-2.1.0实现的生产者和消费者代码样例_第3张图片

 

待续.....

posted @ 2019-05-16 19:44 别先生 阅读( ...) 评论( ...) 编辑 收藏

你可能感兴趣的:(基于kafka_2.11-2.1.0实现的生产者和消费者代码样例)