Apache Kafka API AdminClient Topic的创建与删除

14 篇文章 8 订阅

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
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值