Notes on a micronaut admin controller for kafka - krickert/search-api GitHub Wiki
Yes, Micronaut Kafka does provide an AdminClient
bean out of the box, so you don’t need to manually create it in most cases. You can inject it directly into your classes where needed.
AdminClient
How to Use Micronaut’s Micronaut automatically configures an AdminClient
if Kafka is enabled in your application. You can inject it like this:
import io.micronaut.context.annotation.Requires;
import jakarta.inject.Singleton;
import org.apache.kafka.clients.admin.AdminClient;
import org.apache.kafka.clients.admin.NewTopic;
import org.apache.kafka.common.config.TopicConfig;
import java.util.Collections;
import java.util.Map;
import java.util.concurrent.ExecutionException;
@Singleton
@Requires(property = "kafka.enabled", notEquals = "false")
public class KafkaTopicManager {
private final AdminClient adminClient;
public KafkaTopicManager(AdminClient adminClient) {
this.adminClient = adminClient;
}
public void ensureTopicExists(String topicName) {
try {
boolean topicExists = adminClient.listTopics().names().get().contains(topicName);
if (topicExists) {
System.out.println("Topic '" + topicName + "' already exists.");
return;
}
// Define default settings
NewTopic newTopic = new NewTopic(topicName, 3, (short) 1)
.configs(Map.of(
TopicConfig.MAX_MESSAGE_BYTES_CONFIG, String.valueOf(10485760), // 10MB
TopicConfig.RETENTION_MS_CONFIG, String.valueOf(604800000L), // 7 days
TopicConfig.CLEANUP_POLICY_CONFIG, TopicConfig.CLEANUP_POLICY_DELETE
));
adminClient.createTopics(Collections.singletonList(newTopic)).all().get();
System.out.println("Topic '" + topicName + "' created successfully.");
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
AdminClient
?
How Does Micronaut Create Micronaut automatically creates and manages the AdminClient
bean when Kafka is enabled, so you don't need to configure it manually. The client is created from Kafka properties defined in application.yml
or application.properties
.
application.yml
:
Example Kafka Configuration in kafka:
bootstrap-servers: localhost:9092
enabled: true
default:
admin:
client-id: "micronaut-admin-client"
Benefits:
✅ No need to manually create the AdminClient
.
✅ Uses Micronaut's dependency injection.
✅ Managed lifecycle—Micronaut handles shutdown and initialization.
Want to Check If the Bean Exists?
If you're curious whether Micronaut registers AdminClient
as a bean, you can check by running:
import io.micronaut.context.ApplicationContext;
public class Test {
public static void main(String[] args) {
try (ApplicationContext ctx = ApplicationContext.run()) {
System.out.println(ctx.containsBean(AdminClient.class)); // Should print 'true'
}
}
}