基于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 // SerializerkeySerializer = new StringSerializer(); 61 // SerializervalueSerializer = new StringSerializer(); 62 // Producerproducer = new KafkaProducer 63 // keySerializer, valueSerializer); 64 Producer(props, 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 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 }("my-topic",
消费者代码如下所示:
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 KafkaConsumerconsumer = 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文件里面,果然是这个问题。
添加如下所示即可:
然后就可以开心的生产消息和消费消息了啊。开心。
项目结构如下所示:
待续.....
posted @
2019-05-16 19:44 别先生 阅读(
...) 评论(
...) 编辑 收藏