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.

How to Use Micronaut’s AdminClient

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();
        }
    }
}

How Does Micronaut Create AdminClient?

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.

Example Kafka Configuration in application.yml:

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'
        }
    }
}

TL;DR: Yes, Micronaut provides an AdminClient bean automatically! 🎉 You can inject and use it without manual setup.