c# kafka公共方法

ly188:二话不说上代码

 

public class KafkaRepository
    {

        #region  -- 连接信息 --

        /// <summary>
        /// 获取配置信息
        /// </summary>
        /// <returns></returns>
        public string GetConfig()
        {
            var bootstrapServers = AppsettingsHelper.app(new string[] { "Kafka", dbInfo });
            return bootstrapServers;
        }

        #endregion


        #region 配置连接

        private string dbInfo;

        public KafkaRepository()
        {
            dbInfo = "BootstrapServers";
        }

        public KafkaRepository(string db)
        {
            dbInfo = db;
        }
        #endregion

        #region 生产对象

        public static Dictionary<string, IProducer<Null, string>> ProducerDic = new Dictionary<string, IProducer<Null, string>>();

        private IProducer<Null, string> CreateProducerManager()
        {
            IProducer<Null, string> Producer = null;
            if (ProducerDic.Keys.Contains(dbInfo))
            {
                Producer = ProducerDic[dbInfo];
            }

            if (Producer == null)
            {
                var KafkaConnection = GetConfig();
                var config = new ProducerConfig
                {
                    BootstrapServers = KafkaConnection
                };
                Producer = new ProducerBuilder<Null, string>(config).Build();
                ProducerDic[dbInfo] = Producer;
            }
            return Producer;
        }

        #endregion


        #region  同步发送消息给生产者

        /// <summary>
        /// 同步发送消息给生产者
        /// </summary>
        /// <param name="topic"></param>
        /// <param name="message"></param>
        public bool SendMessage(string topic, string message)
        {
            try
            {
                CreateProducerManager().Produce(topic, new Message<Null, string> { Value = message });
                // 3后 Flush到磁盘
                CreateProducerManager().Flush(TimeSpan.FromSeconds(3));
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }


        #endregion

        #region  异步发送消息给生产者
        /// <summary>
        /// 异步发送消息给生产者
        /// </summary>
        /// <param name="topic"></param>
        /// <param name="message"></param>
        public async Task<bool> SendMessageAsync(string topic, string message)
        {
            try
            {
                CreateProducerManager().Produce(topic, new Message<Null, string> { Value = message });
                // 3后 Flush到磁盘
                CreateProducerManager().Flush(TimeSpan.FromSeconds(3));
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }

        }
        #endregion




        #region 消费对象

        private static Dictionary<string, IConsumer<Ignore, string>> ConsumerDic = new Dictionary<string, IConsumer<Ignore, string>>();

        private IConsumer<Ignore, string> CreateConsumerManager()
        {
            IConsumer<Ignore, string> Consumer = null;
            if (ConsumerDic.Keys.Contains(dbInfo))
            {
                Consumer = ConsumerDic[dbInfo];
            }

            if (Consumer == null)
            {
                var KafkaConnection = GetConfig();
                var conf = new ConsumerConfig
                {
                    GroupId = AppsettingsHelper.app(new string[] { "Kafka", "GroupId" }),
                    BootstrapServers = KafkaConnection,
                    AutoOffsetReset = AutoOffsetReset.Earliest,
                    EnableAutoCommit = false,
                    AllowAutoCreateTopics = true
                };
                Consumer = new ConsumerBuilder<Ignore, string>(conf).Build();
                ConsumerDic[dbInfo] = Consumer;
            }
            return Consumer;
        }

        #endregion




        #region 消费
        /// <summary>
        /// 消费
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="topics"></param>
        /// <returns></returns>
        public T ReceiveMessage<T>(string topics)
        {
            try
            {
                var res = string.Empty;
                CreateConsumerManager().Subscribe(topics);
                var cr = CreateConsumerManager().Consume(5000);
                if (cr != null)
                {
                    res = cr.Message.Value;
                }
                return JsonConvert.DeserializeObject<T>(res);
            }
            catch (Exception ex)
            {
                throw;
            }

        }

        #endregion

        #region 链接Kafka建立长链接

        /// <summary>
        /// 链接Kafka建立长链接
        /// </summary>
        /// <param name="topics"></param>
        /// <returns></returns>
        public IConsumer<Ignore, string> ConnectKafka(string topics)
        {
            try
            {

                var KafkaConnection = GetConfig();
                var res = string.Empty;
                var conf = new ConsumerConfig
                {
                    GroupId = AppsettingsHelper.app(new string[] { "Kafka", "GroupId" }),
                    BootstrapServers = KafkaConnection,
                    AutoOffsetReset = AutoOffsetReset.Earliest,
                    EnableAutoCommit = false,
                    AllowAutoCreateTopics = true
                };
                var ConsumerLong = new ConsumerBuilder<Ignore, string>(conf).Build();
                ConsumerLong.Subscribe(topics);

                return ConsumerLong;
            }
            catch (Exception ex)
            {
                throw;
            }
        }
        #endregion
    }

 

posted @ 2021-11-23 09:30  ly188  阅读(266)  评论(0)    收藏  举报