目录
(1)在pom.xml文件中添加,kafka的相关maven依赖
1、对topic进行操作
(1)在pom.xml文件中添加,kafka的相关maven依赖
<!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka -->
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka_2.13</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>3.0.0</version>
</dependency>
(2)连接Kafka
/**
* 连接kafka
* @param kafkaIpPort kafka服务的ip和port
* @return
* @throws Exception
*/
public static AdminClient connectKafka(String kafkaIpPort) throws Exception {
// 设置Kafka服务器的地址
Properties props = new Properties();
props.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaIpPort);
AdminClient adminClient = AdminClient.create(props);
return adminClient;
}
(3)创建topic(指定分区数与副本数)
/**
* 创建topic主题
* @param kafkaIpPort kafka服务的ip和port
* @param topicName topic主题的名称
* @param pattionSize 分区数量
* @param factory 副本数
* @return
*/
public static boolean createTopic(String kafkaIpPort, String topicName, int pattionSize, short factory) {
boolean result = true;
// 创建AdminClient实例
AdminClient adminClient = null;
try {
adminClient = connectKafka(kafkaIpPort);
// 创建主题
NewTopic newTopic = new NewTopic(topicName, pattionSize, factory);
// 使用AdminClient创建主题
CreateTopicsResult topics = adminClient.createTopics(singleton(newTopic));
topics.all().get();
} catch (Exception e) {
result = false;
}finally {
if(adminClient != null){
adminClient.close();
}
}
System.out.println("建表结果________" + result);
return result;
}
(4)校验topic是否存在
/**
* 校验Kafka的topic是否存在
* @param topic topic主题名称
* @param ipPort kafka服务的ip和port
* @return
*/
public static boolean changeTopic(String topic, String ipPort) {
boolean result = true;
// 创建AdminClient实例
AdminClient adminClient = null;
try {
adminClient = connectKafka(ipPort);
// 创建DescribeTopicsOptions对象,设置超时时间
DescribeTopicsOptions options = new DescribeTopicsOptions().timeoutMs(5000);
// 使用AdminClient的describeTopics方法来获取topic的描述信息
DescribeTopicsResult describeTopicsResult = adminClient.describeTopics(singleton(topic), options);
// 获取topic的描述信息
KafkaFuture<TopicDescription> topicDescriptionFuture = describeTopicsResult.values().get(topic);
TopicDescription topicDescription = topicDescriptionFuture.get();
System.out.println("Topic exists: " + topicDescription.name());
}catch (ExecutionException | InterruptedException e) {
System.out.println("Topic does not exist: " + topic);
result = false;
} catch (Exception e) {
System.out.println("出现异常");
result = false;
}finally {
if(adminClient != null){
adminClient.close();
}
}
return result;
}
(5)批量删除topic
/**
* 批量删除topic
* @param kafkaIpPort kafka服务的ip和port
* @param topic topic主题的名称
* @return
*/
public static boolean deleteTopics(String kafkaIpPort, List<String> topic) {
boolean result = true;
// 创建AdminClient实例
AdminClient adminClient = null;
try {
adminClient = connectKafka(kafkaIpPort);
KafkaFuture<Void> futures = adminClient.deleteTopics(topic).all();
futures.get();
System.out.println("[info]: delete Topic success!");
} catch (Exception e) {
result =false;
System.out.println("删除失败");
}finally {
if(adminClient != null){
adminClient.close();
}
}
return result;
}
(6)增加topic的分区数量
/**
* 修改topic的分区数量(分区数只能增加,不能减少)
* @param kafkaIpPort kafka服务的ip和port
* @param topic topic主题的名称
* @param partitions 分区数量
* @return
*/
public static boolean increTopicPartitions(String kafkaIpPort, String topic, int partitions){
boolean result = true;
AdminClient adminClient = null;
try {
adminClient = connectKafka(kafkaIpPort);
Map<String,NewPartitions> newPartitions =new HashMap<>();
//给Map存入Topic名字和想要增加到的partition数量。参数传入多少就是增加到多少
newPartitions.put(topic,NewPartitions.increaseTo(partitions));
//拿到结果
CreatePartitionsResult partitionsResult = adminClient.createPartitions(newPartitions);
//执行阻塞方法,等待结果完成
partitionsResult.all().get();
System.out.println("done");
}catch (ExecutionException | InterruptedException e) {
System.out.println("Topic does not exist: " + topic);
result = false;
} catch (Exception e) {
System.out.println("出现异常");
result = false;
}finally {
if(adminClient != null){
adminClient.close();
}
}
return result;
}
(7)调方法,实现操作
package com.zsh.kafkatest.topic;
import org.apache.kafka.clients.admin.*;
import org.apache.kafka.common.KafkaFuture;
import java.util.*;
import java.util.concurrent.ExecutionException;
import static java.util.Collections.*;
/**
* @Author ZhaoShuHao
* @Date 2023/7/22
*/
public class CreateTopicExample {
public static void main(String[] args) {
//Kafka服务的ip和port
String kafkaIpPort = "192.168.140.65:9092";
//topic的名称
String topicName = "my-topic7";
//分区数量(分区数只能增加不能减少)
int pattionSize = 6;
//副本数
short factory = (short) 1;
//1、创建topic(指定分区数与副本数)
createTopic(kafkaIpPort,topicName,pattionSize,factory);
//2、校验topic是否存在
changeTopic(topicName,kafkaIpPort);
//3、批量删除topic
List<String> topicname = new ArrayList<>();
topicname.add("my-topic4");
topicname.add("my-topic5");
deleteTopics(kafkaIpPort,topicname);
//4、增加toopic的分区数量
increTopicPartitions(kafkaIpPort,topicName,pattionSize);
}
}