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 }

浙公网安备 33010602011771号