本文是C#引用Confluent.Kafka.dll实现kafka消息队列的实际开发例子
项目需要实现对Kafka的操作,看了很多博客基本上都是旧的方法,代码不可用,所以重新写一篇调用的方法,不足之处多多指出
一、开发环境
IDE:VS2017
.Net Framwork:4.5
Confluent.Kafka:1.3.0
二、测试代码,仅供参考
private readonly static string mTopick = "test";
private readonly static string mBootstrapServers = "localhost:9092";
/// <summary>
/// 生产者
/// </summary>
public static void Produce()
{
var config = new ProducerConfig { BootstrapServers = mBootstrapServers };
Action<DeliveryReport<Null, string>> handler = r =>
Console.WriteLine(!r.Error.IsError
? $"Delivered message to {r.TopicPartitionOffset}"
: $"Delivery Error: {r.Error.Reason}");
var producerBuilder = new ProducerBuilder<Null, string>(config);
// 错误日志监视
producerBuilder.SetErrorHandler((p, msg) =>
{
Console.WriteLine($"Producer_Erro信息:Code:{msg.Code};Reason:{msg.Reason};IsError:{msg.IsError}");
});
using (var producer = producerBuilder.Build())
{
for (int i = 0; i < 5; i++)
{
// 异步发送消息到主题
producer.Produce(mTopick, new Message<Null, string> { Value = i.ToString() }, handler);
}
// 3后 Flush到磁盘
producer.Flush(TimeSpan.FromSeconds(3));
}
}
/// <summary>
/// 消费者
/// </summary>
public static void Consumer()
{
var conf = new ConsumerConfig
{
GroupId = "test-consumer-group",
BootstrapServers = mBootstrapServers,
AutoOffsetReset = AutoOffsetReset.Earliest,
EnableAutoCommit = false // 设置非自动偏移,业务逻辑完成后手动处理偏移,防止数据丢失
};
var consumerBuilder = new ConsumerBuilder<Ignore, string>(conf);
// 错误日志监视
consumerBuilder.SetErrorHandler((p, msg) =>
{
Console.WriteLine($"Consumer_Error信息:Code:{msg.Code};Reason:{msg.Reason};IsError:{msg.IsError}");
});
using (var consumer = consumerBuilder.Build())
{
// 订阅topic
consumer.Subscribe(mTopick);
while (true)
{
try
{
var consume = consumer.Consume();
string receiveMsg = consume.Value;
Console.WriteLine($"Consumed message '{receiveMsg}' at: '{consume.TopicPartitionOffset}'.");
// 开始我的业务逻辑
//...
// 业务结束
if (true)
{
consumer.Commit(new List<TopicPartitionOffset>() { consume.TopicPartitionOffset }); //手动提交偏移
}
}
catch (ConsumeException e)
{
Console.WriteLine($"Consumer_Error occured: {e.Error.Reason}");
}
}
}
}