这是我参与11月更文挑战的第25天,活动详情查看:2021最后一次更文挑战 让我们创建一个使用 Java 客户端发布和使用消息的应用程序。Kafka 生产者客户端由以下 API 组成。
Kafka生产者API
让我们了解本节中最重要的一组 Kafka 生产者 API。KafkaProducer API 的核心部分是"KafkaProducer"类。KafkaProducer 类提供了一个选项,可以使用以下方法在其构造函数中连接 Kafka 代理。
- KafkaProducer 类提供了 send 方法来向主题异步发送消息。send()的签名如下
producer.send(new ProducerRecord<byte[],byte[]>(topic,
partition, key1, value1) , callback);
- ProducerRecord - 生产者管理等待发送的记录缓冲区。
- 回调- 当服务器确认记录时执行的用户提供的回调(null 表示没有回调)。
- KafkaProducer 类提供了一个flush 方法来确保之前发送的所有消息实际上已经完成。刷新方法的语法如下 -
public void flush()
- KafkaProducer 类提供了 partitionFor 方法,该方法有助于获取给定主题的分区元数据。这可用于自定义分区。此方法的签名如下 -
public Map metrics()
它返回由生产者维护的内部指标的映射。
- public void close() - KafkaProducer 类提供关闭方法块,直到所有先前发送的请求完成。
生产者 API
Producer API 的核心部分是"Producer"类。Producer 类提供了通过以下方法在其构造函数中连接 Kafka broker 的选项。
生产者类
生产者类提供了使用以下签名将消息发送到单个或多个主题的send 方法。
public void send(KeyedMessaget<k,v> message)
- sends the data to a single topic,par-titioned by key using either sync or async producer.
public void send(List<KeyedMessage<k,v>>messages)
- sends data to multiple topics.
Properties prop = new Properties();
prop.put(producer.type,”async”)
ProducerConfig config = new ProducerConfig(prop);
有两种类型的生产者——同步和异步。
相同的 API 配置也适用于"同步"生产者。它们之间的区别是同步生产者直接发送消息,但在后台发送消息。当您想要更高的吞吐量时,首选异步生产者。在 0.8 等以前的版本中,异步生产者没有 send() 回调来注册错误处理程序。这仅在 0.9 的当前版本中可用。
公共无效关闭()
Producer 类提供close方法来关闭与所有 Kafka 代理的生产者池连接。
SimpleProducer 应用程序
在创建应用程序之前,首先启动 ZooKeeper 和 Kafka broker,然后使用 create topic 命令在 Kafka broker 中创建您自己的主题。然后创建一个名为"Sim-pleProducer.java"的 java 类并输入以下代码。
//import util.properties packages
import java.util.Properties;
//import simple producer packages
import org.apache.kafka.clients.producer.Producer;
//import KafkaProducer packages
import org.apache.kafka.clients.producer.KafkaProducer;
//import ProducerRecord packages
import org.apache.kafka.clients.producer.ProducerRecord;
//Create java class named “SimpleProducer”
public class SimpleProducer {
public static void main(String[] args) throws Exception{
// Check arguments length value
if(args.length == 0){
System.out.println("Enter topic name");
return;
}
//Assign topicName to string variable
String topicName = args[0].toString();
// create instance for properties to access producer configs
Properties props = new Properties();
//Assign localhost id
props.put("bootstrap.servers", “localhost:9092");
//Set acknowledgements for producer requests.
props.put("acks", “all");
//If the request fails, the producer can automatically retry,
props.put("retries", 0);
//Specify buffer size in config
props.put("batch.size", 16384);
//Reduce the no of requests less than 0
props.put("linger.ms", 1);
//The buffer.memory controls the total amount of memory available to the producer for buffering.
props.put("buffer.memory", 33554432);
props.put("key.serializer",
"org.apache.kafka.common.serializa-tion.StringSerializer");
props.put("value.serializer",
"org.apache.kafka.common.serializa-tion.StringSerializer");
Producer<String, String> producer = new KafkaProducer
<String, String>(props);
for(int i = 0; i < 10; i++)
producer.send(new ProducerRecord<String, String>(topicName,
Integer.toString(i), Integer.toString(i)));
System.out.println(“Message sent successfully”);
producer.close();
}
}
编译- 可以使用以下命令编译应用程序。
javac -cp “/path/to/kafka/kafka_2.11-0.9.0.0/lib/*” *.java
执行- 可以使用以下命令执行应用程序。
java -cp “/path/to/kafka/kafka_2.11-0.9.0.0/lib/*”:. SimpleProducer <topic-name>
输出
Message sent successfully
To check the above output open new terminal and type Consumer CLI command to receive messages.
>> bin/kafka-console-consumer.sh --zookeeper localhost:2181 —topic <topic-name> —from-beginning
1
2
3
4
5
6
7
8
9
10