如何使用.Net中的Confluent.Kafka从特定的TopicPartitionOffset中消费

时间:2018-12-29 10:17:02

标签: c# .net .net-core kafka-consumer-api confluent-kafka

我需要我的消费者从特定的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消耗了所有偏移量的所有消息,但这不是我想要的。

1 个答案:

答案 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();
            }