using Confluent.Kafka; using Microsoft.Extensions.Configuration; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Confluent.Kafka.Admin; using Microsoft.Extensions.Logging; using Volo.Abp.DependencyInjection; namespace JiShe.CollectBus.Kafka.AdminClient { public class AdminClientService : IAdminClientService, ISingletonDependency { private readonly ILogger _logger; /// /// Initializes a new instance of the class. /// /// The configuration. /// The logger. public AdminClientService(IConfiguration configuration, ILogger logger) { _logger = logger; GetInstance(configuration); } /// /// Gets or sets the instance. /// /// /// The instance. /// public IAdminClient Instance { get; set; } = default; /// /// Gets the instance. /// /// The configuration. /// public IAdminClient GetInstance(IConfiguration configuration) { var enableAuthorization = bool.Parse(configuration["Kafka:EnableAuthorization"]); var adminClientConfig = new AdminClientConfig() { BootstrapServers = configuration["Kafka:BootstrapServers"], }; if (enableAuthorization) { adminClientConfig.SecurityProtocol = SecurityProtocol.SaslPlaintext; adminClientConfig.SaslMechanism = SaslMechanism.Plain; adminClientConfig.SaslUsername = configuration["Kafka:SaslUserName"]; adminClientConfig.SaslPassword = configuration["Kafka:SaslPassword"]; } Instance = new AdminClientBuilder(adminClientConfig).Build(); return Instance; } /// /// Checks the topic asynchronous. /// /// The topic. /// public async Task CheckTopicAsync(string topic) { var metadata = Instance.GetMetadata(TimeSpan.FromSeconds(5)); return await Task.FromResult(metadata.Topics.Exists(a => a.Topic == topic)); } /// /// Creates the topic if not exist asynchronous. /// /// Name of the topic. /// The factor number. /// The partition number. public async Task CreateTopicIfNotExistAsync(string topicName, short factorNum, int partitionNum) { try { if (await CheckTopicAsync(topicName)) return; await Instance.CreateTopicsAsync(new TopicSpecification[] { new TopicSpecification { Name = topicName, ReplicationFactor = factorNum, NumPartitions = partitionNum } }); } catch (CreateTopicsException e) { _logger.LogError($"An error occured creating topic {e.Results[0].Topic}: {e.Results[0].Error.Reason}"); } } /// /// Deletes the topic asynchronous. /// /// Name of the topic. public async Task DeleteTopicAsync(List topicName) { try { await Instance.DeleteTopicsAsync(topicName, null); } catch (DeleteTopicsException e) { _logger.LogError($"An error occured creating topic {e.Results[0].Topic}: {e.Results[0].Error.Reason}"); } } } }