通过Spring-Kafka列出Kafka主题

时间:2018-11-28 20:45:03

标签: java apache-kafka kafka-consumer-api spring-kafka

我们想通过spring-kafka列出所有Kafka主题,以获得类似于kafka命令的结果:

bin/kafka-topics.sh --list --zookeeper localhost:2181

在下面的服务中运行getTopics()方法时,我们得到 org.apache.kafka.common.errors.TimeoutException:提取主题元数据时超时已过期

配置:

@EnableKafka
@Configuration
public class KafkaConfig {
    @Bean
    public ConsumerFactory<String, String> consumerFactory() {
        Map<String, Object> props = new HashMap<>();
        props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:2181");
        props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, 
            StringDeserializer.class);
        props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, 
            StringDeserializer.class);
        return new DefaultKafkaConsumerFactory<>(props);
}

服务:

@Service
public class TopicServiceKafkaImpl implements TopicService {
    @Autowired
    private ConsumerFactory<String, String> consumerFactory;

    @Override
    public Set<String> getTopics() {
        try (Consumer<String, String> consumer = 
            consumerFactory.createConsumer()) {
            Map<String, List<PartitionInfo>> map = consumer.listTopics();
            return map.keySet();
    }
}

Kafka已启动并正在运行,我们可以将应用程序中的消息成功发送到某个主题。

3 个答案:

答案 0 :(得分:3)

您正在连接到Zookeeper(2181),而不是Kafka(默认为9092)。

Java kafka客户端不再直接与ZK对话。

答案 1 :(得分:3)

kafka-topics --list是一个shell脚本,它只是https://github.com/cloudfoundry/bosh-lite类的包装,您可以在其中找到所需的方法

或者,您也可以使用kafka.admin.TopicCommand方法

答案 2 :(得分:0)

您可以使用Admin Client列出类似的主题

    Properties properties = new Properties();
    properties.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");

    AdminClient adminClient = AdminClient.create(properties);

    ListTopicsOptions listTopicsOptions = new ListTopicsOptions();
    listTopicsOptions.listInternal(true);

    System.out.println("topics:" + adminClient.listTopics(listTopicsOptions).names().get());