KafKa消费开发
KafKa消费开发配置
以下代码需要写完整,不完整会出现中断,假死现象,长时间不处理问题。(实际项目代码)
/// <summary>
/// - offsets 是自动提交的。
/// - consumer.Poll / OnMessage 是用于消息消费的。
/// - 没有为轮询循环创建(Poll)二外的线程,当然可以创建
/// </summary>
public static void Run_Poll(string brokerList, List<string> topics)
{
var config = new ConsumerConfig
{
BootstrapServers = brokerList,
GroupId = $"Consumer_{topics[0]}_test", //_{topics[0]} //修改此值会导致数据重新计算
EnableAutoCommit = false, // 禁止AutoCommit
//Acks = Acks.Leader, // 假设只需要Leader响应即可
AutoOffsetReset = AutoOffsetReset.Earliest, // 从最早的开始消费起
StatisticsIntervalMs=5000,// 5秒内无数据输出侦听中
SessionTimeoutMs=6000,
//EnablePartitionEof=true
};
try
{
using (var consumer = new ConsumerBuilder<Ignore, string>(config).SetErrorHandler((_,e)=> {
LogInfo($"ErrorHandler:{e.Reason}");
Console.WriteLine($"ErrorHandler:{e.Reason}");
}).SetStatisticsHandler((_, json) => {
//LogInfo($"{DateTime.Now} 消息监听中...");
Console.WriteLine($"{DateTime.Now} 消息监听中...");
}).Build())
{
consumer.Subscribe(topics);
try
{
while (true)
{
Stopwatch swIshttp = new Stopwatch();
swIshttp.Start();
try
{
System.Threading.CancellationToken cancellationToken = default;
var consumeResult = consumer.Consume(cancellationToken);
bool returnBl = true;
if (consumeResult.Message != null)
{
returnBl = SenMsg("", consumeResult.Offset.ToString(), consumeResult.Topic, consumeResult.Message.Value, consumeResult.Timestamp.UtcDateTime);
}
//Console.WriteLine($"Consumed message '{consumeResult.Message?.Value}' at: '{consumeResult?.TopicPartitionOffset}'.");
if (consumeResult.IsPartitionEOF)
{
Console.WriteLine($"{DateTime.Now:yyyy-MM-dd HH:mm:ss} 已经到底了:{consumeResult.Topic}, partition {consumeResult.Partition}, offset {consumeResult.Offset}.");
Thread.Sleep(1000);
continue;
}
if (returnBl)//处理完成,做标记
{
try
{
consumer.Commit(consumeResult);
}
catch (KafkaException e)
{
LogInfo($"Commit 处理完成,做标记失败 : {e.Message}--{e.StackTrace}");
//Console.WriteLine(e.Message);
}
}
}
catch (ConsumeException e)
{
Console.WriteLine($"Consume error: {e.Error.Reason}");
LogInfo($"Consume error: {e.Error.Reason}");
}
swIshttp.Stop();
if (swIshttp.ElapsedMilliseconds > ElapsedMillisecondsMax)
{
// Console.WriteLine($"consumer.Consume 用时过长 {swIshttp.ElapsedMilliseconds}");
}
}
}
catch (OperationCanceledException ee)
{
Console.WriteLine("Closing consumer.");
LogInfo($"Closing consumer.: {ee.Message}--{ee.StackTrace}");
consumer.Close();
}
catch (Exception ex)
{
Console.WriteLine($"Run_Poll ERR.{ex.Message}");
LogInfo($"Run_Poll .: {ex.Message}--{ex.StackTrace}");
}
}
}catch(Exception ex)
{
Console.WriteLine($"Run_Poll 处理失败.{ex.Message}");
LogInfo($"Run_Poll 处理失败 {ex.Message} {ex.StackTrace} ");
}
}
浙公网安备 33010602011771号