繁体   English   中英

Apache Kafka Client(Java):列出主题并检查主题是否经过日志压缩

[英]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()获取每个主题的配置。
  • 最后,您可以从ConfigEntry对象中筛选出具有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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM