internal KafkaConsumer([NotNull] IKafkaBuilderOptions <TKey, TValue> builderOptions, [NotNull] ILogger <KafkaConsumer <TKey, TValue> > logger, Tracer tracer = null) { var kafkaBuilderOptions = builderOptions ?? throw new ArgumentNullException(nameof(builderOptions)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _tracer = tracer; var config = new ConsumerConfig(kafkaBuilderOptions.KafkaProviderOptions.AdditionalConfiguration) { BootstrapServers = kafkaBuilderOptions.KafkaProviderOptions.BootstrapServers, GroupId = kafkaBuilderOptions.KafkaProviderOptions.GroupId, AutoOffsetReset = kafkaBuilderOptions.KafkaProviderOptions.AutoOffsetReset, EnableAutoCommit = kafkaBuilderOptions.KafkaProviderOptions.EnableAutoCommit, SaslUsername = kafkaBuilderOptions.KafkaProviderOptions.SaslUsername, SaslPassword = kafkaBuilderOptions.KafkaProviderOptions.SaslPassword, SecurityProtocol = kafkaBuilderOptions.KafkaProviderOptions.SecurityProtocol, SaslMechanism = kafkaBuilderOptions.KafkaProviderOptions.SaslMechanism }; _consumer = new ConsumerBuilder <TKey, TValue>(config) .SetValueDeserializer(kafkaBuilderOptions.Serializers.ValueDeserializer) .SetErrorHandler((_, e) => _logger.LogError(e.Reason)) .SetLogHandler((_, e) => _logger.LogInformation(e.Message)) .SetPartitionsAssignedHandler((_, e) => _logger.LogDebug("Assigned partitions: [{partitions}]", string.Join(", ", e.Select(x => x.Partition)))) .SetPartitionsRevokedHandler((_, e) => _logger.LogDebug("Revoked partitions: [{partitions}]", string.Join(", ", e.Select(x => x.Partition)))) .Build(); _consumer.Subscribe(kafkaBuilderOptions.KafkaProviderOptions.Topic); }
/// <summary> /// Sets the Kafka Topic. /// </summary> /// <param name="builderOptions">The <see cref="IKafkaBuilderOptions{TKey, TValue}"/> to build upon.</param> /// <param name="topicName">The topic name.</param> /// <typeparam name="TKey">The Key value of the message.</typeparam> /// <typeparam name="TValue">The Value of the message.</typeparam> /// <returns>The <see cref="IKafkaBuilderOptions{TKey, TValue}"/> to allow chaining.</returns> /// <exception cref="ArgumentNullException"></exception> public static IKafkaBuilderOptions <TKey, TValue> WithTopic <TKey, TValue>([NotNull] this IKafkaBuilderOptions <TKey, TValue> builderOptions, [NotNull] string topicName) { if (builderOptions == null) { throw new ArgumentNullException(nameof(builderOptions)); } if (string.IsNullOrWhiteSpace(topicName)) { throw new ArgumentException($"'{nameof(topicName)}' must not be null, empty or whitespace.", nameof(topicName)); } builderOptions.KafkaProviderOptions.Topic = topicName; return(builderOptions); }
/// <summary> /// Sets the ValueSerializer and ValueDeserializer to use JSON. /// </summary> /// <param name="builderOptions">The <see cref="IKafkaBuilderOptions{TKey, TValue}"/> to build upon.</param> /// <typeparam name="TKey">The Key value of the message.</typeparam> /// <typeparam name="TValue">The Value of the message.</typeparam> /// <returns>The <see cref="IKafkaBuilderOptions{TKey, TValue}"/> to allow chaining.</returns> /// <exception cref="ArgumentNullException"></exception> public static IKafkaBuilderOptions <TKey, TValue> WithJson <TKey, TValue>([NotNull] this IKafkaBuilderOptions <TKey, TValue> builderOptions) { if (builderOptions == null) { throw new ArgumentNullException(nameof(builderOptions)); } builderOptions.Serializers = new Serializers <TKey, TValue> { ValueSerializer = new JsonSerializer <TValue>(), ValueDeserializer = new JsonDeserializer <TValue>() }; return(builderOptions); }
internal KafkaProducer([NotNull] IKafkaBuilderOptions <TKey, TValue> kafkaBuilderOptions, [NotNull] ILogger <KafkaProducer <TKey, TValue> > logger, Tracer tracer = null) { _kafkaBuilderOptions = kafkaBuilderOptions ?? throw new ArgumentNullException(nameof(kafkaBuilderOptions)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _tracer = tracer; var config = new ProducerConfig(_kafkaBuilderOptions.KafkaProviderOptions.AdditionalConfiguration) { BootstrapServers = _kafkaBuilderOptions.KafkaProviderOptions.BootstrapServers, MessageTimeoutMs = _kafkaBuilderOptions.KafkaProviderOptions.MessageTimeoutMs, SaslUsername = _kafkaBuilderOptions.KafkaProviderOptions.SaslUsername, SaslPassword = _kafkaBuilderOptions.KafkaProviderOptions.SaslPassword, SecurityProtocol = _kafkaBuilderOptions.KafkaProviderOptions.SecurityProtocol, SaslMechanism = _kafkaBuilderOptions.KafkaProviderOptions.SaslMechanism }; _producer = new ProducerBuilder <TKey, TValue>(config) .SetValueSerializer(_kafkaBuilderOptions.Serializers) .SetErrorHandler((_, e) => _logger.LogError(e.Reason)) .SetLogHandler((_, e) => _logger.LogInformation(e.Message)) .Build(); }
/// <summary> /// Configure the Kafka Provider Options from configuration. /// </summary> /// <param name="builderOptions">The <see cref="IKafkaBuilderOptions{TKey, TValue}"/> to build upon.</param> /// <param name="configurationSection">The <see cref="IConfigurationSection"/> which binds to <see cref="KafkaProviderOptions"/>.</param> /// <typeparam name="TKey">The Key value of the message.</typeparam> /// <typeparam name="TValue">The Value of the message.</typeparam> /// <returns>The <see cref="IKafkaBuilderOptions{TKey, TValue}"/> to allow chaining.</returns> /// <exception cref="ArgumentNullException"></exception> public static IKafkaBuilderOptions <TKey, TValue> FromConfiguration <TKey, TValue>([NotNull] this IKafkaBuilderOptions <TKey, TValue> builderOptions, [NotNull] IConfigurationSection configurationSection) { if (builderOptions == null) { throw new ArgumentNullException(nameof(builderOptions)); } builderOptions.KafkaProviderOptions = configurationSection?.Get <KafkaProviderOptions>() ?? new KafkaProviderOptions(); return(builderOptions); }