在尝试生成该主题之前,我如何知道是否已经在Kafka集群中以编程方式使用 而不是创建了一个主题?
我遇到了一个问题,该主题不存在,我们的应用程序尝试生成一个不存在的主题,但仅在90秒(元数据超时)后才得到通知。我想知道是否有一种方法可以从Java代码中知道该主题是否存在,以便我们可以在实际尝试发送消息之前进行检查。我想我可以看一下Kafka CLI实用程序使用的代码,但是我想知道是否可能有我可能错过的API或更简单的方法。
答案 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"));