Kafkaコマンドと同様の結果を得るために、spring-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が稼働しており、アプリからトピックにメッセージを正常に送信できます。
Kafka(デフォルトでは9092)ではなくZookeeper(2181)に接続しています。
Java kafkaクライアントはZKと直接通信しなくなりました。
kafka-topics --list
は、探しているメソッドを見つけることができる kafka.admin.TopicCommand
クラスのラッパーであるシェルスクリプトです。
または、 AdminClient#listTopics
メソッドを使用することもできます
管理クライアントを使用して、このようなトピックを一覧表示できます
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());