kafka java动态获取topic并动态创建消费者
时间: 2024-01-30 20:02:28 浏览: 57
要动态获取 Kafka topic 并动态创建消费者,可以使用 Kafka Java 客户端提供的 AdminClient 和 Consumer API。
首先,使用 AdminClient 获取 Kafka 集群中的所有 topic:
```java
Properties props = new Properties();
props.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
AdminClient adminClient = AdminClient.create(props);
ListTopicsResult topicsResult = adminClient.listTopics();
Set<String> topics = topicsResult.names().get();
```
然后,根据获取到的 topic 动态创建消费者:
```java
Properties props = new Properties();
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
props.put(ConsumerConfig.GROUP_ID_CONFIG, "my-group");
props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
for (String topic : topics) {
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Collections.singletonList(topic));
// 处理消息
while (true) {
ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
for (ConsumerRecord<String, String> record : records) {
System.out.printf("topic=%s, partition=%d, offset=%d, key=%s, value=%s%n",
record.topic(), record.partition(), record.offset(), record.key(), record.value());
}
}
}
```
需要注意的是,动态创建消费者可能会导致过多的消费者实例,因此需要根据实际情况进行动态调整。此外,为了避免过多的消费者实例,可以考虑使用 Kafka 的消费者组来协调消费者实例。
阅读全文