C# 实现kafka发消息

本文详细介绍如何在C#环境中使用Confluent.Kafka插件进行消息队列的生产和消费操作,包括配置Kafka地址、创建生产者和消费者、处理消息、错误管理和自动提交等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,引用dll包,使用 Confluent.Kafka 插件,直接在nuget中安装即可;

2,生产者代码

        /// <summary>
        /// 生产者
        /// </summary>
        /// <param name="inputParams"></param>
        public static void AsyncMain(JObject inputParams)
        {
            string url = Properties.Settings.Default.DeviceUrl;//获取配置的kafka地址
            var conf = new ProducerConfig { BootstrapServers = url };
            Action<DeliveryReport<Null, string>> handler = r =>
                Console.WriteLine(!r.Error.IsError
                    ? $"Delivered message to {r.Value}"
                    : $"Delivery Error: {r.Error.Reason}");

            using (var p = new ProducerBuilder<Null, string>(conf).Build())
            {
                //获取约定好的topic 
                mytopic = Properties.Settings.Default.DeviceTopic;
                string datastr = inputParams.ToString();
                p.Produce(mytopic, new Message<Null, string> { Value = datastr }, handler);
                p.Flush(TimeSpan.FromSeconds(10));
            }
        }

3,消费者代码

/// <summary>
        /// 消费kafka
        /// </summary>
        public static string Run_Consume(JObject inputParams)
        {
            string returnmsg = "";
            string topics = Properties.Settings.Default.JZHisTopic;
            // CancellationToken cancellationToken = new CancellationToken();
            string brokerList = Properties.Settings.Default.DeviceUrl;

            var config = new ConsumerConfig
            {
                BootstrapServers = brokerList,
                GroupId = "csharp-consumer",
                EnableAutoCommit = false,
                StatisticsIntervalMs = 5000,
                SessionTimeoutMs = 6000,
                AutoOffsetReset = AutoOffsetReset.Earliest,
                EnablePartitionEof = true
            };

            const int commitPeriod = 5;

            using (var consumer = new ConsumerBuilder<Ignore, string>(config)
                .SetErrorHandler((_, e) => Console.WriteLine($"Error: {e.Reason}"))
                .SetStatisticsHandler((_, json) => Console.WriteLine($"Statistics: {json}"))
                .SetPartitionsAssignedHandler((c, partitions) =>
                {
                    Console.WriteLine($"Assigned partitions: [{string.Join(", ", partitions)}]");

                })
                .SetPartitionsRevokedHandler((c, partitions) =>
                {
                    Console.WriteLine($"Revoking assignment: [{string.Join(", ", partitions)}]");
                })
                .Build())
            {
                consumer.Subscribe(topics);
                try
                {
                    while (true)
                    {
                        try
                        { 
                            var consumeResult = consumer.Consume();
                            if (consumeResult.IsPartitionEOF)
                            {
                                Console.WriteLine(
                                    $"Reached end of topic {consumeResult.Topic}, partition {consumeResult.Partition}, offset {consumeResult.Offset}.");

                                continue;
                            }

                            Console.WriteLine($"Received message at {consumeResult.TopicPartitionOffset}: {consumeResult.Value}");

                            if (consumeResult.Offset % commitPeriod == 0)
                            {
                                try
                                {
                                    consumer.Commit(consumeResult);
                                    returnmsg = returnmsg + consumeResult.Value;
                                }
                                catch (KafkaException e)
                                {
                                    Console.WriteLine($"Commit error: {e.Error.Reason}");
                                }
                            }
                        }
                        catch (ConsumeException e)
                        {
                            Console.WriteLine($"Consume error: {e.Error.Reason}");
                        }
                    }
                }
                catch (OperationCanceledException)
                {
                    Console.WriteLine("Closing consumer.");
                    consumer.Close();
                }
            }

            return returnmsg;
        }

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值