在Java中以编程方式检查是否存在Kafka主题

时间:2018-10-23 23:43:04

标签: java apache-kafka

在尝试生成该主题之前,我如何知道是否已经在Kafka集群中以编程方式使用 而不是创建了一个主题?

我遇到了一个问题,该主题不存在,我们的应用程序尝试生成一个不存在的主题,但仅在90秒(元数据超时)后才得到通知。我想知道是否有一种方法可以从Java代码中知道该主题是否存在,以便我们可以在实际尝试发送消息之前进行检查。我想我可以看一下Kafka CLI实用程序使用的代码,但是我想知道是否可能有我可能错过的API或更简单的方法。

2 个答案:

答案 0 :(得分:3)

您可以使用AdminClient#listTopics()来检查给定主题是否存在,如下所示:

Properties props = new Properties();
props.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
try (AdminClient client = AdminClient.create(props)) {
    ListTopicsOptions options = new ListTopicsOptions();
    options.listInternal(true); // includes internal topics such as __consumer_offsets
    ListTopicsResult topics = client.listTopics(options);
    Set<String> currentTopicList = topics.names().get();
    // do your filter logic here......
}

答案 1 :(得分:1)

对于较旧的kafka版本(1.0.0),您可以使用AdminUtils.topicExists(..)方法来检查主题是否存在:

    int sessionTimeOutInMs = 15 * 1000;
    int connectionTimeOutInMs = 10 * 1000;
    String zkHost = "localhost:2181";
    ZkClient zkClient = new ZkClient(zkHost, sessionTimeOutInMs, connectionTimeOutInMs, ZKStringSerializer$.MODULE$);
    ZkUtils zkUtils = new ZkUtils(zkClient, new ZkConnection(zkHost), false);
    System.out.println(AdminUtils.topicExists(zkUtils, "TopicName"));

最近的Kafka版本不推荐使用AdminUtils。因此,您可以将AdminClient用于kafka 1.0 +:

    Properties prop = new Properties();
    prop.setProperty("bootstrap.servers", "localhost:9092");
    AdminClient admin = AdminClient.create(prop);
    boolean topicExists = admin.listTopics().names().get().stream().anyMatch(topicName -> topicName.equalsIgnoreCase("tealium.topic"));