Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
以Java编程方式检查是否存在卡夫卡主题_Java_Apache Kafka - Fatal编程技术网

以Java编程方式检查是否存在卡夫卡主题

以Java编程方式检查是否存在卡夫卡主题,java,apache-kafka,Java,Apache Kafka,在尝试生成主题之前,如何知道主题是否已在Kafka集群中以编程方式创建,而不使用CLI工具 我遇到了一个问题,主题不存在,我们的应用程序试图生成一个不存在的主题,但它只在90秒后得到通知(元数据超时)。我想知道是否有一种方法可以从Java代码中知道主题是否存在,这样我们就可以在实际尝试发送消息之前进行检查。我想我可以看看Kafka CLI utils使用的代码,但我想知道是否有API或更简单的方法我可能错过了。您可以使用AdminClient\#listTopics()检查给定主题是否存在,如下

在尝试生成主题之前,如何知道主题是否已在Kafka集群中以编程方式创建,而不使用CLI工具


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

您可以使用
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......
}
Properties=newproperties();
put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG,“localhost:9092”);
try(AdminClient=AdminClient.create(props)){
ListTopicsOptions=新建ListTopicsOptions();
options.listInternal(true);//包括内部主题,如u_消费者_偏移量
ListTopicsResult topics=client.listTopics(选项);
Set currentTopicList=topics.names().get();
//在这里做你的过滤逻辑。。。。。。
}

对于较旧的卡夫卡版本(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"));
最近的卡夫卡版本中不推荐使用AdminUtils。因此,您可以对kafka 1.0+使用
AdminClient

    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"));

CLI工具只是最终编写的编程Java API的包装器,所以为什么不看看这些代码呢?所有这些API都不推荐使用,所以我不建议使用它们。相反,请使用
AdminClient
。如果我们要检查单个主题的存在,并且Kafka上可能有数千个主题,则此API似乎不太有效。如果您担心潜在的性能低效,您可以使用
AdminClient.descripbetopics
,通过捕获UnknownTopicOrPartitionException来检查是否存在。我不这么认为。AdminClient在获得响应后,快速为不存在的主题抛出
UnknownTopicOrPartitionException
。您可以通过尝试捕获此异常来了解该异常的存在。就性能而言,您的意思是捕获异常会消耗更多的JVM指令吗?构造和释放异常的成本很高。异常应用于异常情况,而不是正常流量。请看这里: