以Java编程方式检查是否存在卡夫卡主题
在尝试生成主题之前,如何知道主题是否已在Kafka集群中以编程方式创建,而不使用CLI工具以Java编程方式检查是否存在卡夫卡主题,java,apache-kafka,Java,Apache Kafka,在尝试生成主题之前,如何知道主题是否已在Kafka集群中以编程方式创建,而不使用CLI工具 我遇到了一个问题,主题不存在,我们的应用程序试图生成一个不存在的主题,但它只在90秒后得到通知(元数据超时)。我想知道是否有一种方法可以从Java代码中知道主题是否存在,这样我们就可以在实际尝试发送消息之前进行检查。我想我可以看看Kafka CLI utils使用的代码,但我想知道是否有API或更简单的方法我可能错过了。您可以使用AdminClient\#listTopics()检查给定主题是否存在,如下
我遇到了一个问题,主题不存在,我们的应用程序试图生成一个不存在的主题,但它只在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指令吗?构造和释放异常的成本很高。异常应用于异常情况,而不是正常流量。请看这里: