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
}