[英]Apache Kafka Client (Java) : List topics and check whether topic is log compacted
背景
我们公司中有由Zookeeper管理的Apache Kafka。 我们的Spring Boot应用程序之一需要检查所有可用主题的列表,还需要列出启用了日志压缩的主题(cleanup.policy = compact)。
当前代码
@Bean
public ConsumerFactory<String, String> consumerFactory() {
Map<String, Object> props = new HashMap<>();
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaBrokerList);
props.put(ConsumerConfig.GROUP_ID_CONFIG, kafkaConsumerGroup);
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
return new DefaultKafkaConsumerFactory<>(props);
}
...
...
public List<String> getTopics() {
Map<String, List<PartitionInfo>> topics = consumerFactory().createConsumer().listTopics();
List<String> topicList = new ArrayList<>();
topics.keySet().remove(CONSUMER_OFFSETS);
topicList.addAll(topics.keySet());
return topicList;
}
题
使用上面的代码,应用程序可以获取主题列表。 是否有办法也了解各个主题是否经过日志压缩? 我正在寻找某种“ Java”方式来获得与从终端运行以下Apache Kafka CLI命令时得到的响应相同的响应。
kafka-topics --zookeeper localhost:2181 --describe --topic TestTopicCompact
对此的一个示例响应
Topic:TestTopicCompact PartitionCount:1 ReplicationFactor:1 Configs:cleanup.policy=compact
Topic: TestTopicCompact Partition: 0 Leader: 1001 Replicas: 1001 Isr: 1001
您应该使用AdminClient API检索该信息。
listTopics()
检索主题列表。 describeConfigs()
获取每个主题的配置。 compact
的主题,如cleanup.policy
。 基本上,这就是kafka-topics
工具的工作,因此您可以查看其源代码kafka.admin.TopicCommand
。 即使是Scala,概念也是相似的。
您首先需要使用属性文件创建kafka管理客户端。
import org.apache.kafka.clients.admin.AdminClient;
import java.util.*;
import org.apache.kafka.clients.admin.Config;
import org.apache.kafka.clients.admin.ConfigEntry;
import org.apache.kafka.clients.admin.DescribeConfigsResult;
import org.apache.kafka.common.config.ConfigResource;
admin = AdminClient.create(properties);
然后,您需要使用admin.describeConfigs方法,该方法将ConfigResources的集合作为参数定义如下。
Collection<ConfigResource> cr = Collections.singleton( new ConfigResource(ConfigResource.Type.TOPIC, "<Your Topic Name>")
DescribeConfigsResult ConfigsResult = admin.describeConfigs(cr));
然后,您需要使用ConfigsResult评估并解析此数据类型,在此我将其硬转换为config数据类型。
Config all_configs = (Config)ConfigsResult.all().get().values().toArray()[0];
然后,您需要遍历all_configs数据类型,该数据类型包含许多ConfigResource对象。 下面的代码构建一个迭代器,循环遍历并查找用于清理策略的config的配置值,您可以使用相同的逻辑来查找其他字段的config值。
Iterator ConfigIterator = all_configs.entries().iterator();
while (ConfigIterator.hasNext())
{
ConfigEntry currentConfig = (ConfigEntry) ConfigIterator.next();
if (currentConfig.name().equals("cleanup.policy")) {
System.out.println(currentConfig.value());
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.