private void PollForMessages() { while (!_stopped) { try { var result = _consumer.Value.Consume(_disposeSource.Token); var message = new KafkaReceiverMessage(_consumer.Value, result, EnableAutoOffsetStore); if (_connected != true) { _connected = true; OnConnected(); } var task = MessageHandler.OnMessageReceivedAsync(this, message); _trackingCollection.Add(task); } catch (OperationCanceledException) when(_disposeSource.IsCancellationRequested) { return; } catch (Exception ex) { OnError("Error in polling loop.", ex); // TODO: Delay the loop? } } }
/// <summary> /// Replays messages. /// </summary> protected virtual async Task Replay(IConsumer <string, byte[]> consumer, List <TopicPartitionOffset> startOffsets, DateTime endTimestamp, Func <IReceiverMessage, Task> callback, bool enableAutoOffsetStore) { consumer.Assign(startOffsets); var partitionsFinished = new bool[startOffsets.Count]; while (true) { var result = consumer.Consume(TimeSpan.FromSeconds(5)); if (result is null) { return; } var afterEndTimestamp = false; for (int i = 0; i < startOffsets.Count; i++) { if (result.TopicPartition == startOffsets[i].TopicPartition && result.Message.Timestamp.UtcDateTime > endTimestamp) { afterEndTimestamp = partitionsFinished[i] = true; break; } } if (partitionsFinished.All(finished => finished is true)) { return; } if (afterEndTimestamp) { continue; } var message = new KafkaReceiverMessage(consumer, result, enableAutoOffsetStore); try { await callback(message); } catch { /* TODO: Something? */ } } }