我需要我的消费者从特定的TopicPartitionOffset(here from offset 278)
中消费。假设消息是由某些生产者在特定主题(例如="Test_1"
)之前产生的。
这是我的代码
using System;
using Confluent.Kafka;
public class ConsumingTest
{
public static void Main(string[] args)
{
var consumerConfig = new ConsumerConfig
{
BootstrapServers = "localhost:9092", EnableAutoCommit = false, GroupId = "this-group-id"
};
using (var consumer = new Consumer<Null, string>(consumerConfig))
{
Console.WriteLine("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Consume Started...");
consumer.Subscribe("Test_1");
var topicPartitionOffset = new TopicPartitionOffset("Test_1", new Partition(0), new Offset(278));
consumer.Assign(topicPartitionOffset);
consumer.Seek(topicPartitionOffset);
while (true)
try
{
var cr = consumer.Consume();
Console.WriteLine($"Consumed message '{cr.Value}' at: '{cr.TopicPartitionOffset}'.");
}
catch (ConsumeException e)
{
Console.WriteLine(e.Message);
}
}
}
}
在行---->中的 var cr = consumer.Consume();
消费者在消费,但是什么也没发生。有什么问题。
我已经在ConsumerConfig中完成了AutoOffsetReset = AutoOffsetResetType.Earliest
,并且Consumer消耗了所有偏移量的所有消息,但这不是我想要的。
答案 0 :(得分:5)
解决:我找到了如下描述的解决方案:
consumer.Assign(new TopicPartitionOffset(topicName, 0, new Offset(lastConsumedOffset)))
尝试使用之前,和
consumer.Subscribe("Test_1")
和consumer.Seek(...)
所以更新后的代码很像这样:
using (var consumer = new Consumer<Ignore, string>(config))
{
consumer.Assign(topicName, 0, new Offset(lastConsumedOffset));
while (true)
{
try
{
var consumeResult = consumer.Consume();
Console.WriteLine($"Received message at {consumeResult.TopicPartitionOffset}: ${consumeResult.Value}");
}
catch (ConsumeException e)
{
Console.WriteLine($"Consume error: {e.Error}");
}
}
consumer.Close();
}