Kafka Java API

Kafka是一个基于ZooKeeper的高吞吐量低延迟的分布式的发布与订阅消息系统

Kafka提供了Java客户端API进行消息的创建与接收。

依赖:

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

创建生产者:

public class MyProducer2 {

    public static void main(String[] args) {
        //1. 使用properties定义kafka环境属性
        Properties props = new Properties();
        //设置生产者 broker服务器连接地址
        props.setProperty(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "centos01:9092,centos02:9092,centos03:9092");
        //设置序列化key程序类
        props.setProperty(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        //设置序列化value程序类,此处不一定非得是Integer,也可以是String
        props.setProperty(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, IntegerSerializer.class.getName());
        //2. 定义消息生产者对象,依靠此对象可以进行消息的传递
        Producer<String, Integer> producer = new KafkaProducer<String, Integer>(props);

        //3. 循环发送10条消息
        for (int i = 0; i < 10; i++) {
            //发送消息,第一个参数为主题名称,第二个参数为消息的key值,第三个参数为消息的value值
            //此方式只负责发送消息,不知道是否发送成功
            // producer.send(new ProducerRecord<String, Integer>("topictest", "hello kafka " + i, i));

            //同步方式发送消息
            //使用生产者对象的send()方法发送消息,会返回一个Future对象,然后调用Future对象的get()方法进行等待,就可以知道消息是否发送成功。如果服务器返回错误,get()方法会抛出异常。如果没有发生错误,我们会得到一个RecordMetadata对象,可以用它获取消息的偏移量。最简单的同步发送消息的代码如下:
            /*try {
                producer.send(new ProducerRecord<String, Integer>("topictest", "hello kafka " + i, i)).get();
            } catch (Exception e) {
                e.printStackTrace();
            }*/

            //异步方式发送消息,可以指定一个回调函数,服务器返回响应时会调用该函数。我们可以在该函数中对一些异常信息进行处理,比如记录错误日志或者把消息写入“错误消息”文件以便日后分析。
            producer.send(new ProducerRecord<String, Integer>("topictest", "hello kafka " + i, i), new Callback() {
                public void onCompletion(RecordMetadata recordMetadata, Exception e) {
                    System.out.println(recordMetadata.toString());
                    if (e != null) {
                        e.printStackTrace();
                    }
                }
            });

        }
        //4.关闭生产者
        producer.close();
    }

}

创建消费者:

public class MyConsumer {

    public static void main(String[] args) {
        //1. 使用Properties定义配置属性
        Properties props = new Properties();
        //设置消费者 Broker服务器的连接地址
        props.setProperty(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "centos01:9092,centos02:9092,centos03:9092");
        //设置反序列化key的程序类,与生产者对应
        props.setProperty(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
        //设置反序列化value的程序类,与生产者对应
        props.setProperty(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, IntegerDeserializer.class.getName());
        //设置消费者组ID,即组名称,值可自定义。组名称相同的消费者进程属于同一个消费者组。
        props.setProperty(ConsumerConfig.GROUP_ID_CONFIG, "groupid-1");
        //2. 定义消费者对象
        Consumer<String, Integer> consumer = new KafkaConsumer<String, Integer>(props);
        //3. 设置消费者读取的主题名称,可以设置多个
        consumer.subscribe(Arrays.asList("topictest"));
        //4. 不停的读取消息
        while (true) {
            //拉取消息,并设置超时时间为10秒
            ConsumerRecords<String, Integer> records = consumer.poll(Duration.ofSeconds(10));
            for (ConsumerRecord<String, Integer> record : records) {
                //打印消息关键信息
                System.out.println("key:" + record.key() + ",value:" + record.value() + ",partition:" + record.partition() + ",offset:" + record.offset());
            }
        }
    }

}  

 

书籍:Hadoop大数据技术开发实战 11.9 Java API操作

https://gitee.com/caoyeoo0/xc-springboot/blob/kafka/src/main/java/com/xc/xcspringboot/test/MyProducer2.java

 

posted @ 2022-11-14 14:01  草木物语  阅读(88)  评论(0编辑  收藏  举报