kafka java API 的使用

Kafka包含四种核心的API:
  1、Producer API支持应用将数据流发送到Kafka集群的主题
  
  2、Consumer API支持应用从Kafka集群的主题中读取数据流
  
  3、Streams API支持数据流从输入主题转化到输出主题
  
  4、Connect API支持实现持续地从一些源系统或应用划入Kafka或者从Kafka推入一些源系统或应用的接口。

我们这里主要讨论Producer API和Consumer API的使用,由于最新版的kafka java api中使用了一些jdk8的新特性,所以要求我们在本机上jdk版本要在8以上。

一、创建队列

开启kafka

zkServer.sh start 
kafka-server-start.sh -daemon /opt/kafka/config/server.properties

创建队列

kafka-topics.sh --zookeeper hadoop001:2181 --create --topic test --partitions 3 --replication-factor 1

二、引入依赖

创建maven项目在pom导入依赖

<dependency>
	<groupId>org.apache.kafka</groupId>
	<artifactId>kafka-clients</artifactId>
	<version>2.0.0</version>
</dependency>

三、Producer的API

public class MyProducer {
    public static void main(String[] args) {
    	Properties prop=new Properties();
    	prop.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,"192.168.184.40:9092");
    	prop.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,StringSerializer.class);
		prop.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,StringSerializer.class);
		prop.put(ProducerConfig.ACKS_CONFIG,"-1");
		KafkaProducer<String,String> producer=new KafkaProducer<>(prop);
		for (int i = 0; i < 200; i++) {
            ProducerRecord<String,String> producerRecord =
                    new ProducerRecord<>("test","test"+i);
            producer.send(producerRecord);
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("消息发送完毕");
	}
}
  • bootstrap_servers 配置项处需要填写要发送到的Kafka集群地址。
  • acks 配置项用来控制producer要求leader确认多少消息后返回调用成功。当值为0时producer不需要等待任何确认消息。当值为1时只需要等待leader确认。当值为-1或all时需要全部ISR集合返回确认才可以返回成功。
  • key_serializer 和 value_serializer 指定使用什么序列化方式将用户提供的key和value进行序列化。

四、Consumer的API

public class MyConsumer {
    public static void main(String[] args) {
        Properties prop = new Properties();
        prop.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,"192.168.184.40:9092");
        prop.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
        prop.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,StringDeserializer.class);
        prop.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG,"30000");
        prop.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG,"false");
        //prop.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG,"1000");
        //earliest   latest   none
        //auto.offset.reset=latest 情况下,新的消费者将会从其他消费者最后消费的 offset 处开始消费 Topic 下的消息
        //auto.offset.reset= earliest 情况下,新的消费者会从该 topic 最早的消息开始消费
        //auto.offset.reset=none 情况下,新的消费者加入以后,由于之前不存在 offset,则会直接抛出异常
        prop.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG,"earliest");
//        prop.put(ConsumerConfig.GROUP_ID_CONFIG,"G1");
//        KafkaConsumer<String, String> consumer = new KafkaConsumer<>(prop);
//        consumer.subscribe(Collections.singleton("test"));


        //一个消费者组G1里只有一个消费者
        /*while(true) {
            ConsumerRecords<String, String> poll = consumer.poll(100);
            for (ConsumerRecord<String, String> record : poll) {
                System.out.println(record.offset()+"\t"+record.key()+"\t"+record.value());
            }
        }*/


        //模拟多消费者在同一个分组G2
        prop.put(ConsumerConfig.GROUP_ID_CONFIG,"G2");
        for (int i = 0; i < 2; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    KafkaConsumer<String, String> consumer = new KafkaConsumer<>(prop);
                    consumer.subscribe(Collections.singleton("test"));
                    while(true) {
                        ConsumerRecords<String, String> poll = consumer.poll(100);
                        for (ConsumerRecord<String, String> record : poll) {
                            System.out.println(Thread.currentThread().getName()+"\t"+record.offset()+"\t"+record.key()+"\t"+record.value());
                        }
                    }
                }
            }).start();
        }
    }
}
  • bootstrap_servers配置项指定了consumer需要连接的服务器集群。多台服务器用“,”分隔
  • key_deserializer和value_deserializer指用什么方式进行反序列化。
  • enable_auto_commit指定是否自动提交,false表手动提交。
  • auto_commit_interval_ms配置项配置了每次自动提交的时间间隔。
  • session_timeout_ms 超时时间设置。
  • auto_offset_reset 设置新的消费者开始消费的位置
  1. auto.offset.reset=latest 情况下,新的消费者将会从其他消费者最后消费的 offset 处开始消费 Topic 下的消息
  2. auto.offset.reset= earliest 情况下,新的消费者会从该 topic 最早的消息开始消费
  3. auto.offset.reset=none 情况下,新的消费者加入以后,由于之前不存在 offset,则会直接抛出异常
  • group_id 即消费者组标签,本例中消费者组的名称为G1、G2。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值