static void Main(string[] args) { var config = new Dictionary <string, object> { { "group.id", "sample-consumer" }, { "bootstrap.servers", "127.0.0.1:9092" }, { "enable.auto.commit", "false" } }; var topic = "my-topic"; Console.WriteLine($"reads messages in {topic}"); using (var consumer = new Consumer <Null, string>(config, null, new StringDeserializer(Encoding.UTF8))) { consumer.Subscribe(new string[] { topic }); consumer.OnError += (_, e) => { Console.WriteLine(e.Reason); }; consumer.OnMessage += (_, msg) => { Console.WriteLine($"Topic: {msg.Topic} Partition: {msg.Partition} Offset: {msg.Offset} {msg.Value}"); consumer.CommitAsync(msg); }; while (true) { consumer.Poll(100); } } }
/// <summary> /// In this example /// - offsets are manually committed. /// - consumer.Consume is used to consume messages. /// (all other events are still handled by event handlers) /// - no extra thread is created for the Poll (Consume) loop. /// </summary> public static void Run_Consume(string brokerList, List <string> topics) { var config = new Dictionary <string, object> { { "bootstrap.servers", brokerList }, { "group.id", "csharp-consumer" }, { "enable.auto.commit", false }, { "statistics.interval.ms", 60000 }, { "session.timeout.ms", 6000 }, { "auto.offset.reset", "smallest" } }; using (var consumer = new Consumer <Ignore, string>(config, null, new StringDeserializer(Encoding.UTF8))) { // Note: All event handlers are called on the main thread. consumer.OnPartitionEOF += (_, end) => Console.WriteLine($"Reached end of topic {end.Topic} partition {end.Partition}, next message will be at offset {end.Offset}"); consumer.OnError += (_, error) => Console.WriteLine($"Error: {error}"); // Raised on deserialization errors or when a consumed message has an error != NoError. consumer.OnConsumeError += (_, error) => Console.WriteLine($"Consume error: {error}"); // Raised when the consumer is assigned a new set of partitions. consumer.OnPartitionsAssigned += (_, partitions) => { Console.WriteLine($"Assigned partitions: [{string.Join(", ", partitions)}], member id: {consumer.MemberId}"); // If you don't add a handler to the OnPartitionsAssigned event, // the below .Assign call happens automatically. If you do, you // must call .Assign explicitly in order for the consumer to // start consuming messages. consumer.Assign(partitions); }; // Raised when the consumer's current assignment set has been revoked. consumer.OnPartitionsRevoked += (_, partitions) => { Console.WriteLine($"Revoked partitions: [{string.Join(", ", partitions)}]"); // If you don't add a handler to the OnPartitionsRevoked event, // the below .Unassign call happens automatically. If you do, // you must call .Unassign explicitly in order for the consumer // to stop consuming messages from it's previously assigned // partitions. consumer.Unassign(); }; consumer.OnStatistics += (_, json) => Console.WriteLine($"Statistics: {json}"); consumer.Subscribe(topics); Console.WriteLine($"Started consumer, Ctrl-C to stop consuming"); var cancelled = false; Console.CancelKeyPress += (_, e) => { e.Cancel = true; // prevent the process from terminating. cancelled = true; }; while (!cancelled) { if (!consumer.Consume(out Message <Ignore, string> msg, TimeSpan.FromMilliseconds(100))) { continue; } Console.WriteLine($"Topic: {msg.Topic} Partition: {msg.Partition} Offset: {msg.Offset} {msg.Value}"); if (msg.Offset % 5 == 0) { var committedOffsets = consumer.CommitAsync(msg).Result; Console.WriteLine($"Committed offset: {committedOffsets}"); } } } }
private async Task CommitMessageAsync(Consumer <string, string> consumer) { await consumer.CommitAsync(); }