Apache Kafka API AdminClient Topic的创建与删除

AdminClient

上一篇【Apache Kafka API AdminClient 获取对象】我们说了怎么获取一个AdminClient,那么这篇博客我们就说下怎么用AdminClient去创建和删除topic的。这个功能可以说是非常有用的,当你的需求越来越多的时候,可能会面临一次创建数十个或者数百个topic的状况。这个时候一个一个的用命令行敲进去显然是要敲死人的,真的是会敲死人的,问我为什么知道呢?笔者最多一次敲过183个topic并给相关的账号赋权,敲了整整三天的回车,Ctrl C和Ctrl V,这辈子都不想在用命令行了。更多内容请点击【Apache Kafka API AdminClient系列】

创建topic

在这里插入图片描述

Create a batch of new topics with the default options. This is a convenience method for #createTopics(Collection, CreateTopicsOptions) with default options.
默认选项下批量创建topic。官网还专门注明了,这是一个创建topic的方便的方法。
但是有一句话特别的重要:This operation is supported by brokers with version 0.10.1.0 or higher. 只支持 0.10.1.0 以后的版本,看官网会发现AdminClient大多数的方法都只支持这个之后的版本,因此该升级还是尽快升级吧。

例子

下面写一个简单例子去完成这个方便的创建topic的方法。

public void creatTopic() {
    
    
	//创建一个新的NewTopic对象,这里的构造参数分别为(topic名字,partition数量,replication数量)
    NewTopic newTopic = new NewTopic("java_kafka_tst", 4, (short) 2);
    //这个Map用来存放Topic的各种参数
    Map<String, String> map = new HashMap<>();
    map.put("cleanup.policy", "compact");
    map.put("compression.type", "gzip");
    map.put("index.interval.bytes", "1000");
    newTopic.configs(map); //写入newTopic对象
    Collection<NewTopic> newTopicList = new ArrayList<>();//创建一个Collection对象
    newTopicList.add(newTopic);//把创建出来的newTopic放入Collection中
    //调用createTopics()方法,并用
    CreateTopicsResult result = adminClient.createTopics(newTopicList);
    try {
    
    
    	//调用get使其执行命令,这里必须调用get,才能影响到kafka broker
        result.all().get(); 
    } catch (Exception e) {
    
    
        System.out.println(e.getCause().getMessage());
    }
}

多个创建

如果想要创建多个topic,只需要用一个for循环即可,当然最好参数都一样,不然要控制很多变量。

public void creatMultipleTopic(String[] topics) {
    
    
    Collection<NewTopic> newTopicList = new ArrayList<>();
    for (String topic : topics) {
    
    
    	//给每一个传递进来的topic创建一个NewTopic
        NewTopic newTopic = new NewTopic(topic, 4, (short) 2); 
        Map<String, String> map = new HashMap<>();
        map.put("cleanup.policy", "compact");
        map.put("compression.type", "gzip");
        map.put("index.interval.bytes", "1000");
        newTopic.configs(map);
        newTopicList.add(newTopic); //把所有新建的topic都添加进去
    }
    //传入要创建topic的Collection
    CreateTopicsResult result = adminClient.createTopics(newTopicList);
    try {
    
    
        result.all().get();//执行创建
    } catch (Exception e) {
    
    
        System.out.println(e.getCause().getMessage());
    }
}

单个控制

也可以在做一个变量,对每一个topic进行一个精准的判断。

public void createFindErrorTopic(String[] topics) {
    
    
    ArrayList<String> errorList=new ArrayList<>(); //创建一个错误数组
    Collection<NewTopic> newTopicList = new ArrayList<>();
    for (String topic : topics) {
    
    
        //...给每一个传递进来的topic创建一个NewTopic...
    }
    CreateTopicsResult result = adminClient.createTopics(newTopicList);
    try {
    
    
        for (Map.Entry<String, KafkaFuture<Void>> entry:result.values().entrySet()) {
    
    
            KafkaFuture<Void> future = entry.getValue();
            future.get();
            if(!future.isDone()){
    
     //凡是发现有问题的
            	//全部添加进去,最后返回出去就知道哪些没有执行成功了
                errorList.add(entry.getKey()); 
            }
        }
    } catch (Exception e) {
    
    
        System.out.println(e.getCause().getMessage());
    }
}

删除topic

在这里插入图片描述
这个方法和createTopics()是相对应的,有创建自然就有删除。同样仅支持0.10.1.0之后的版本。

例子

删除topic就相对来说简单的多,因为没有那么多的参数要设置,这里直接就写一个有返回值的例子演示下。

public Map<String, Boolean> deleteTopic(String[] name) {
    
    
	//传入要删除的topic名字,然后一个一个的删除就可以了。
    DeleteTopicsResult result  = adminClient.deleteTopics(Arrays.asList(name));
    Map<String, Boolean> resultMap = new HashMap<>();
    try {
    
    
        for (Map.Entry<String, KafkaFuture<Void>> e : result.values().entrySet()) {
    
    
            String topic = e.getKey();
            KafkaFuture<Void> future = e.getValue();
            future.get(); //执行
            //直接把结果存到创建好的map中。当然也可以存到list里,这里提供另一种思路。
            resultMap.put(topic,!future.isCompletedExceptionally());
        }
    } catch (InterruptedException | ExecutionException interruptedException) {
    
    
        interruptedException.printStackTrace();
    }
    return resultMap; //返回Map
}

猜你喜欢

转载自blog.csdn.net/Smallc0de/article/details/109032898
今日推荐