在Java中创建之前检查kafka中主题的存在性

在Java中创建之前检查kafka中主题的存在性,java,apache-kafka,Java,Apache Kafka,我正在尝试使用以下方法在卡夫卡0.8.2中创建一个主题: AdminUtils.createTopic(zkClient, myTopic, 2, 1, properties); 如果我在本地多次运行代码进行测试,这将失败,因为主题已经创建。在创建主题之前,是否有方法检查主题是否存在?TopicCommandapi似乎没有为listTopics或describeTopic .为此,可以使用方法adminiutils.topicExists(ZkUtils zkClient,String-top

我正在尝试使用以下方法在卡夫卡0.8.2中创建一个主题:

AdminUtils.createTopic(zkClient, myTopic, 2, 1, properties);
如果我在本地多次运行代码进行测试,这将失败,因为主题已经创建。在创建主题之前,是否有方法检查主题是否存在?
TopicCommand
api似乎没有为
listTopics
describeTopic

.

为此,可以使用方法
adminiutils.topicExists(ZkUtils zkClient,String-topic)
,如果主题已经存在,它将返回
true
,否则返回
false

您的代码将如下所示:

if (!AdminUtils.topicExists(zkClient, myTopic)){
    AdminUtils.createTopic(zkClient, myTopic, 2, 1, properties);
}

您可以从kakfa客户端版本0.11.0.0使用AdminClient

示例代码:

    Properties config = new Properties();
    config.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, "localhist:9091");

    AdminClient admin = AdminClient.create(config);
    ListTopicsResult listTopics = admin.listTopics();
    Set<String> names = listTopics.names().get();
    boolean contains = names.contains("TEST_6");
    if (!contains) {
        List<NewTopic> topicList = new ArrayList<NewTopic>();
        Map<String, String> configs = new HashMap<String, String>();
        int partitions = 5;
        Short replication = 1;
        NewTopic newTopic = new NewTopic("TEST_6", partitions, replication).configs(configs);
        topicList.add(newTopic);
        admin.createTopics(topicList);
    }
Properties config=newproperties();
config.put(AdminClientConfig.BOOTSTRAP_SERVERS_config,“localhist:9091”);
AdminClient admin=AdminClient.create(config);
ListTopicsResult listTopics=admin.listTopics();
Set names=listTopics.names().get();
boolean contains=names.contains(“TEST_6”);
如果(!包含){
List topicList=新的ArrayList();
Map configs=new HashMap();
int=5;
短复制=1;
NewTopic NewTopic=newnewnewtopic(“TEST_6”,分区,复制).configs(configs);
topicList.add(新主题);
管理员创建主题(主题列表);
}
公共静态void createKafkaTopic(字符串sourceTopicName、字符串sinkTopicName、字符串responseTopicName、字符串Kafkarl){
试一试{
属性=新属性();
properties.put(ProducerConfig.BOOTSTRAP\u SERVERS\u CONFIG,kafkaul);
AdminClient kafkaAdminClient=kafkaAdminClient.create(属性);
ListTopicsResult topics=kafkaAdminClient.listTopics();
Set name=topics.names().get();
布尔containsSourceTopic=names.contains(sourceTopicName);
布尔containsSinkTopic=names.contains(sinkTopicName);
布尔containsResponseTopic=names.contains(responseTopicName);
如果(!containsResponseTopic&&!containsSinkTopic&!containsSourceTopic){
CreateTopicsResult=kafkaAdminClient.createTopics(
Stream.of(sourceTopicName、sinkTopicName、responseTopicName).map(
名称->新主题(名称,1,(短)1)
).collect(收集器.toList())
);
result.all().get();
LOG.info(“创建了新的sourceTopicName:{}、sinkTopicName:{}、responseTopicName:{}”,
sourceTopicName、sinkTopicName、responseTopicName);
}
}捕获(ExecutionException | InterruptedException e){
LOG.info(“错误消息{}”,e.getMessage());
}
}

虽然这个代码片段可以解决这个问题,但它确实有助于提高文章的质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码建议的原因。
public static void createKafkaTopic(String sourceTopicName, String sinkTopicName, String responseTopicName, String kafkaUrl) {

    try {
        Properties properties = new Properties();
        properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaUrl);
        AdminClient kafkaAdminClient = KafkaAdminClient.create(properties);
        ListTopicsResult topics = kafkaAdminClient.listTopics();
        Set <String> names = topics.names().get();

        boolean containsSourceTopic = names.contains(sourceTopicName);
        boolean containsSinkTopic = names.contains(sinkTopicName);
        boolean containsResponseTopic = names.contains(responseTopicName);

        if (!containsResponseTopic && !containsSinkTopic && !containsSourceTopic) {
            CreateTopicsResult result = kafkaAdminClient.createTopics(
                    Stream.of(sourceTopicName, sinkTopicName, responseTopicName).map(
                            name -> new NewTopic(name, 1, (short) 1)
                    ).collect(Collectors.toList())
            );
            result.all().get();
            LOG.info("new sourceTopicName: {}, sinkTopicName: {}, responseTopicName: {} are created",
                    sourceTopicName, sinkTopicName, responseTopicName);
        }
    } catch (ExecutionException | InterruptedException e) {
        LOG.info("Error message {}", e.getMessage());
    }
}