如何使用Kafka 1.1.0以编程方式创建主题

时间:2018-07-10 21:23:27

标签: java apache-kafka

我最近升级到了Kafka 1.1.0。我正在尝试为kafka用户创建单元测试。为此,单元测试可以创建用于测试的主题是理想的。我发现一些看起来像它应该做我想要的代码。但是,当我运行它时,它将引发异常:java.lang.NoSuchMethodError:org.apache.kafka.common.utils.Utils.closeQuietly(Ljava / lang / AutoCloseable; Ljava / lang / String;)V

以下是创建主题的代码,该主题在网上找到:

@BeforeClass
public static void createTopic() {
   try (final AdminClient adminClient = AdminClient.create(configure())) {
        try {
            // Define topic
            NewTopic newTopic = new NewTopic("test-orders", 1, (short)1);

            // Create topic, which is async call.
            final CreateTopicsResult createTopicsResult = adminClient.createTopics(Collections.singleton(newTopic));

            // Since the call is Async, Lets wait for it to complete.
            createTopicsResult.values().get(ordersTopic).get();
        } catch (InterruptedException | ExecutionException e) {
            if (!(e.getCause() instanceof TopicExistsException)) {
                throw new RuntimeException(e.getMessage(), e);
            }
        }
    }
}

但是我运行它时会引发异常。

java.lang.NoSuchMethodError: org.apache.kafka.common.utils.Utils.closeQuietly(Ljava/lang/AutoCloseable;Ljava/lang/String;)V
at org.apache.kafka.clients.admin.KafkaAdminClient.createInternal(KafkaAdminClient.java:334)
at org.apache.kafka.clients.admin.AdminClient.create(AdminClient.java:52)
at com.sial.notifications.topics.OrdersTopicsTests.createTopic(OrdersTopicsTests.java:162)

我传递给它的唯一配置参数是引导服务器和client.id。 我究竟做错了什么?看起来很简单

2 个答案:

答案 0 :(得分:1)

当我针对1.1.0经纪人独立运行该代码时,对我进行了稍微修改的代码:

CLLocationCoordinate2D neCoordinate = self.mapboxMapView.visibleCoordinateBounds.ne;
CLLocationCoordinate2D swCoordinate = self.mapboxMapView.visibleCoordinateBounds.sw;

由于这与您的代码非常相似,并且根据您所看到的错误,也许您还没有完全整理出对Kafka库的依赖关系?我使用了Maven工件public static void main(String[] args) { final String ordersTopic = "test-orders"; Properties props = new Properties(); props.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); try (final AdminClient adminClient = AdminClient.create(props)) { try { // Define topic NewTopic newTopic = new NewTopic(ordersTopic, 1, (short)1); // Create topic, which is async call. final CreateTopicsResult createTopicsResult = adminClient.createTopics(Collections.singleton(newTopic)); // Since the call is Async, Lets wait for it to complete. createTopicsResult.values().get(ordersTopic).get(); } catch (InterruptedException | ExecutionException e) { if (!(e.getCause() instanceof TopicExistsException)) throw new RuntimeException(e.getMessage(), e); } } }

答案 1 :(得分:0)

一种简单得多的方法是将Kafka配置为自动创建您使用的,尚不存在的任何主题

auto.create.topics.enable

设置卡夫卡。这样做,不需要 额外的代码即可创建主题。您只需使用所需的任何主题名称,Kafka就会在使用时为您创建。