All Downloads are FREE. Search and download functionalities are using the official Maven repository.

no.nav.common.kafka.consumer.util.KafkaConsumerClientBuilder Maven / Gradle / Ivy

package no.nav.common.kafka.consumer.util;

import io.micrometer.core.instrument.MeterRegistry;
import no.nav.common.kafka.consumer.KafkaConsumerClient;
import no.nav.common.kafka.consumer.KafkaConsumerClientConfig;
import no.nav.common.kafka.consumer.TopicConsumer;
import no.nav.common.kafka.consumer.feilhandtering.KafkaConsumerRepository;
import no.nav.common.kafka.consumer.feilhandtering.StoreOnFailureTopicConsumer;
import org.apache.kafka.common.serialization.Serializer;

import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

public class KafkaConsumerClientBuilder {

    private final Map> consumerMap = new HashMap<>();

    private final Map> consumersWithErrorHandlingMap = new HashMap<>();

    private Properties properties;

    private long pollDurationMs = -1;

    private KafkaConsumerRepository consumerRepository;

    private Serializer keySerializer;

    private Serializer valueSerializer;

    private boolean enableLogging;

    private MeterRegistry meterRegistry;

    private KafkaConsumerClientBuilder() {}

    public static  KafkaConsumerClientBuilder builder() {
        return new KafkaConsumerClientBuilder();
    }

    public KafkaConsumerClientBuilder withProps(Properties properties) {
        this.properties = properties;
        return this;
    }

    public KafkaConsumerClientBuilder withConsumer(String topic, TopicConsumer consumer) {
        consumerMap.put(topic, consumer);
        return this;
    }

    public KafkaConsumerClientBuilder withConsumers(Map> topicConsumers) {
        consumerMap.putAll(topicConsumers);
        return this;
    }

    public KafkaConsumerClientBuilder withStoreOnFailureConsumer(String topic, TopicConsumer topicConsumer) {
        consumersWithErrorHandlingMap.put(topic, topicConsumer);
        return this;
    }

    public KafkaConsumerClientBuilder withStoreOnFailureConsumers(Map> topicConsumers) {
        consumersWithErrorHandlingMap.putAll(topicConsumers);
        return this;
    }

    public KafkaConsumerClientBuilder withLogging() {
        this.enableLogging = true;
        return this;
    }

    public KafkaConsumerClientBuilder withMetrics(MeterRegistry meterRegistry) {
        this.meterRegistry = meterRegistry;
        return this;
    }

    public KafkaConsumerClientBuilder withRepository(KafkaConsumerRepository consumerRepository) {
        this.consumerRepository = consumerRepository;
        return this;
    }

    public KafkaConsumerClientBuilder withSerializers(Serializer keySerializer, Serializer valueSerializer) {
        this.keySerializer = keySerializer;
        this.valueSerializer = valueSerializer;
        return this;
    }

    public KafkaConsumerClientBuilder withPollDuration(long pollDurationMs) {
        this.pollDurationMs = pollDurationMs;
        return this;
    }

    public KafkaConsumerClient build() {
        if (properties == null) {
            throw new IllegalStateException("Cannot build kafka consumer without properties");
        }

        if (!consumersWithErrorHandlingMap.isEmpty()) {
            if (consumerRepository == null) {
                throw new IllegalStateException("Consumer repository is required when using error handling");
            }

            if (keySerializer == null || valueSerializer == null) {
                throw new IllegalStateException("Key serializer and value serializer is required when using error handling");
            }
        }

        consumersWithErrorHandlingMap.forEach((topic, consumer) -> {
            consumerMap.put(topic, new StoreOnFailureTopicConsumer<>(consumer, consumerRepository, keySerializer, valueSerializer));
        });

        Map> extendedConsumers = new HashMap<>();

        consumerMap.forEach((topic, consumer) -> {
            TopicConsumerBuilder builder = TopicConsumerBuilder.builder();

            if (enableLogging) {
                builder.withLogging();
            }

            if (meterRegistry != null) {
                builder.withMetrics(meterRegistry);
            }

            builder.withConsumer(consumer);

            extendedConsumers.put(topic, builder.build());
        });

        KafkaConsumerClientConfig config = new KafkaConsumerClientConfig<>(properties, extendedConsumers);

        if (pollDurationMs >= 0) {
            config.setPollDurationMs(pollDurationMs);
        }

        return new KafkaConsumerClient<>(config);
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy