我想使用Confluent dotnet client处理应用程序启动中的主题。假设以下示例:
while (true)
{
try
{
var cr = c.Consume();
Console.WriteLine($"Consumed message '{cr.Value}' at: '{cr.TopicPartitionOffset}'.");
}
catch (ConsumeException e)
{
Console.WriteLine($"Error occured: {e.Error.Reason}");
}
}
当Kafka中没有新消息时,c.Consume将被阻止。因为我想将其用于应用程序启动(如缓存预热),所以我发现没有新消息时要继续执行我的代码。
我知道设置c.Consume(timeout)
之类的超时设置有很多问题,但是这种方法的问题是,如果您的主题中有一条消息,并且阅读消息的持续时间超过了超时时间,您会收到空输出,这是不希望的。
答案 0 :(得分:1)
不应使消费者知道生产者。
现在,如果您想知道从开始消费起就已经阅读了该主题中的所有内容,则可以:
我不是C#
开发人员,但是从我在dotnet融合文档中所读的内容中,您可以在使用者上调用QueryWatermarkOffsets
以获取最旧和最新的偏移量。 https://docs.confluent.io/current/clients/confluent-kafka-dotnet/api/Confluent.Kafka.Consumer.html#Confluent_Kafka_Consumer_QueryWatermarkOffsets_Confluent_Kafka_TopicPartition_
然后,在Message
类上,您有一个Offset
访问器。因此,整个事情不应太难实现。
https://docs.confluent.io/current/clients/confluent-kafka-dotnet/api/Confluent.Kafka.Message.html#Confluent_Kafka_Message_Offset
答案 1 :(得分:0)
您可以使用OnPartitionEOF
事件,它表明您已经到达分区末尾。
CancellationTokenSource source = new CancellationTokenSource();
bool isContinue = true;
c.OnPartitionEOF += (o, e) =>
{
Console.WriteLine($"You have reached end of partition");
isContinue = false;
source.Cancel();
};
while (isContinue)
{
try
{
var cr = c.Consume(source.Token);
Console.WriteLine($"Consumed message '{cr.Value}' at: '{cr.TopicPartitionOffset}'.");
}
catch (ConsumeException e)
{
Console.WriteLine($"Error occured: {e.Error.Reason}");
}
}
答案 2 :(得分:0)
我发现 Consumer.IsPartitionEOF 很有用。