io.quarkus.kafka.client.runtime.KafkaAdminClient Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of quarkus-kafka-client Show documentation
Show all versions of quarkus-kafka-client Show documentation
Connect to Apache Kafka with its native API
package io.quarkus.kafka.client.runtime;
import static io.quarkus.kafka.client.runtime.KafkaRuntimeConfigProducer.TLS_CONFIG_NAME_KEY;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ExecutionException;
import java.util.stream.Collectors;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.PreDestroy;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import org.apache.kafka.clients.admin.*;
import org.apache.kafka.common.acl.AccessControlEntryFilter;
import org.apache.kafka.common.acl.AclBinding;
import org.apache.kafka.common.acl.AclBindingFilter;
import org.apache.kafka.common.resource.ResourcePatternFilter;
import io.quarkus.kafka.client.runtime.devui.model.request.KafkaCreateTopicRequest;
import io.smallrye.common.annotation.Identifier;
@ApplicationScoped
public class KafkaAdminClient {
private static final int DEFAULT_ADMIN_CLIENT_TIMEOUT = 5000;
@Inject
@Identifier("default-kafka-broker")
Map config;
private AdminClient client;
@PostConstruct
void init() {
Map conf = new HashMap<>();
conf.put(AdminClientConfig.REQUEST_TIMEOUT_MS_CONFIG, DEFAULT_ADMIN_CLIENT_TIMEOUT);
for (Map.Entry entry : config.entrySet()) {
String key = entry.getKey();
// include TLS config name if it has been configured
if (TLS_CONFIG_NAME_KEY.equals(key) || AdminClientConfig.configNames().contains(key)) {
conf.put(key, entry.getValue().toString());
}
}
client = AdminClient.create(conf);
}
@PreDestroy
void stop() {
client.close();
}
public DescribeClusterResult getCluster() {
return client.describeCluster();
}
public Collection getTopics() throws InterruptedException, ExecutionException {
return client.listTopics().listings().get();
}
public Collection getConsumerGroups() throws InterruptedException, ExecutionException {
var consumerGroupIds = client.listConsumerGroups().all().get().stream()
.map(ConsumerGroupListing::groupId)
.collect(Collectors.toList());
return client.describeConsumerGroups(consumerGroupIds).all().get()
.values();
}
public boolean deleteTopic(String name) {
Collection topics = new ArrayList<>();
topics.add(name);
DeleteTopicsResult dtr = client.deleteTopics(topics);
return dtr.topicNameValues() != null;
}
public boolean createTopic(KafkaCreateTopicRequest kafkaCreateTopicRq) {
var partitions = Optional.ofNullable(kafkaCreateTopicRq.getPartitions()).orElse(1);
var replications = Optional.ofNullable(kafkaCreateTopicRq.getReplications()).orElse((short) 1);
var newTopic = new NewTopic(kafkaCreateTopicRq.getTopicName(), partitions, replications);
CreateTopicsResult ctr = client.createTopics(List.of(newTopic));
return ctr.values() != null;
}
public ListConsumerGroupOffsetsResult listConsumerGroupOffsets(String groupId) {
return client.listConsumerGroupOffsets(groupId);
}
public Collection getAclInfo() throws InterruptedException, ExecutionException {
AclBindingFilter filter = new AclBindingFilter(ResourcePatternFilter.ANY, AccessControlEntryFilter.ANY);
var options = new DescribeAclsOptions().timeoutMs(1_000);
return client.describeAcls(filter, options).values().get();
}
public Map describeTopics(Collection topicNames)
throws InterruptedException, ExecutionException {
return client.describeTopics(topicNames)
.allTopicNames()
.get();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy