Kafka简单案例之异步发送消息

一. 案例需求

使用IDEA工具创建Maven项目编写API
Producer端采用异步生产发送消息
Consumer端在虚拟机开启窗口消费数据

二. 异步发送API实战

  1. 导入Kafka的依赖

        
            org.apache.kafka</groupId>
            kafka-clients</artifactId>
            0.11.0.0</version>
        </dependency>
</dependencies>
  1. 代码编写

1). 不带回调函数的API

package com.learn.kafka;

import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.common.serialization.StringSerializer;

import java.util.Properties;

public class TestProducer {
    public static void main(String[] args) {

        //参数配置
        //创建配置对象
        Properties prop = new Properties();
        //指定Kafka集群的主机名和端口号
        prop.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,"cos100:9092");
        prop.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        prop.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,StringSerializer.class.getName());
        //ack参数配置
        prop.put(ProducerConfig.ACKS_CONFIG,"all");
        //只有数据积累到batch.size的设定大小之后,sender才会发送数据
        prop.put(ProducerConfig.BATCH_SIZE_CONFIG,16384);
        //如果数据迟迟未达到batch.size,sender等待linger.time之后就会发送数据
        prop.put(ProducerConfig.LINGER_MS_CONFIG,1);

        //创建Topic对象
        KafkaProducer, String> producer = new KafkaProducer, String>(prop);

        //调用send方法
        for(int i=0;i<100;i++){
            producer.send(new ProducerRecord, String>("test",i+"","message-"+i));
        }

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

代码编写完成后运行,Producer端开始产生并发送数据;
Consumer端在主机群起Zookeeper和Kafka服务,运行consumer命令,即可消费到Producer生产发送的数据

[root@cos100 kafka]# bin/kafka-console-consumer.sh --bootstrap-server cos100:9092 --topic test
message-4
message-6
message-10
message-12
message-13
message-14
message-18
message-19
message-20
...

2). 带回调函数的API
和不带回调函数的API类似,增加回调函数,消息发送成功或失败会返回对应的信息

package com.learn.kafka;

import org.apache.kafka.clients.producer.*;
import org.apache.kafka.common.serialization.StringSerializer;

import java.util.Properties;

public class CallbackProducer {
    public static void main(String[] args) {

        //参数配置
        Properties prop = new Properties();
        prop.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,"cos100:9092");
        prop.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        prop.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,StringSerializer.class.getName());
        prop.put(ProducerConfig.ACKS_CONFIG,"all");
        prop.put(ProducerConfig.BATCH_SIZE_CONFIG,16384);
        prop.put(ProducerConfig.LINGER_MS_CONFIG,1);

        //创建Topic对象
        KafkaProducer, String> producer = new KafkaProducer, String>(prop);

        //调用send方法
        for(int i=0;i<100;i++){
            producer.send(new ProducerRecord, String>("test", i + "", "message-" + i), new Callback() {
                public void onCompletion(RecordMetadata recordMetadata, Exception e) {
                    if(e == null){
                        System.out.println("发送成功");
                    }else{
                        e.printStackTrace();
                    }
                }
            });
        }

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

Consumer端消费到的信息如下:

[root@cos100 kafka]# kafka-console-consumer.sh --bootstrap-server cos100:9092 --topic test
message-4
message-6
message-10
message-12
message-13
message-14
message-18
message-19
message-20
message-24
...

Producer端在控制台接收的返回信息如下:
Kafka简单案例之异步发送消息_第1张图片

完毕!

你可能感兴趣的:(Kafka简单案例之异步发送消息)