package kafka;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;
import java.util.Properties;
public class KafkaProducerDemo {
//生产者api 简单demo 搬自官网
public static void main(String[] args) {
//===producer统一配置
// http://kafka.apache.org/documentation/#producerapi 官网
Properties properties = new Properties();//创建配置实例
properties.put("bootstrap.servers","192.168.1.201:6667,192.168.1.202:6667");//多写俩个防止其中一个宕机
// properties.put("acks","1");//指定ack机制的等级 0为速度极快但是安全性很差 1为速度还可以安全性可保证 -1为最安全 速度较慢 但没必要
// properties.put("retries","0");//重试发送消息次数 默认为0
// properties.put("batch.size", 16384);//一批获取的数据量 16k
// properties.put("linger.ms", 1);//
// properties.put("buffer.memory", 33554432);//缓存大小
properties.put("key.serializer","org.apache.kafka.common.serialization.StringSerializer");//key的序列化
properties.put("value.serializer","org.apache.kafka.common.serialization.StringSerializer");//value的序列化
KafkaProducer<String, String> kk = new KafkaProducer<String, String>(properties);//将配置加载进来
for(int i=0;i<30;i++) {
kk.send(new ProducerRecord<String, String>("test", Integer.toString(i%6), "hello"));
}
kk.close();
}
}
========================================
package kafka;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import java.util.Arrays;
import java.util.Properties;
public class KafkaConsumerDemo {
public static void main(String[] args) {
// http://kafka.apache.org/documentation/#producerapi 官网
Properties props = new Properties();
props.put("bootstrap.servers", "192.168.1.201:6667,192.168.1.202:6667");//
props.put("group.id", "test");//设置消费组id ,组id可以重新设置以获取从头到位的消息
props.put("auto.offset.reset","earliest");//此设置的earliest是从上次订阅到的地方继续订阅 latest是从头部开始订阅 仅限于新的消费组 如果消费组已经把前面的订阅过了 那么将无法再次重新订阅前面的内容 只能申请一个新的消费组就可以从头开始在订阅一次
props.put("enable.auto.commit", "false");//自动拉取 一般不设置为ture 这样无法控制订阅的offset
props.put("auto.commit.interval.ms", "1000");//提交offset的时间间隔为1000ms一次
props.put("session.timeout.ms", "30000");//会话时长为30000
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
//通过配置,新建一个消费者实例
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
//订阅topic主题test001
consumer.subscribe(Arrays.asList("test"));
while (true){//死循环 内部
ConsumerRecords<String, String> polls = consumer.poll(100);//消费者,主动去拉去数据,参数为轮询间隔,也就是100ms拉取一次.
for(ConsumerRecord<String, String> po:polls){//poll是一个容器 只能遍历
System.out.println(po.key()+po.topic()+po.value()+po.offset()+po.partition());//相当于消费了订阅
}
consumer.commitSync();//提交当前订阅的offset
}
}
}
/*
在这里会遇到一个问题
如果是先消费然后在维护offset那么网络闪断等一些不确定因素导致没有成功提交当前消费的offset导致下一次重复消费(在这里官网提供了一套api关于每个分区的offset下面为核心代码)
try {
while(running) {
ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(Long.MAX_VALUE));
for (TopicPartition partition : records.partitions()) {
List<ConsumerRecord<String, String>> partitionRecords = records.records(partition);
for (ConsumerRecord<String, String> record : partitionRecords) {
System.out.println(record.offset() + ": " + record.value());
}
long lastOffset = partitionRecords.get(partitionRecords.size() - 1).offset();
consumer.commitSync(Collections.singletonMap(partition, new OffsetAndMetadata(lastOffset + 1)));
}
}
} finally {
consumer.close();
}
如果是先维护offset在消费如果有不确定因素发生导致当期的消费没有消费完整,下一次消费的时候会跳过本次没有消费的内容直接走下一批的订阅
这两种问题最好根据业务需求调整
*/
91



被折叠的 条评论
为什么被折叠?



