Пример #1
0
        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);
        }
Пример #4
0
        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);
        }