使用JavaApi实现对Kafka的topic的增删改查

目录

1、对topic进行操作

(1)在pom.xml文件中添加,kafka的相关maven依赖

(2)连接Kafka

(3)创建topic(指定分区数与副本数)

(4)校验topic是否存在

(5)批量删除topic

(6)增加toopic的分区数量

(7)调方法,实现操作

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);
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值