public void CatchUp(long from) { var reader = new PostgresqlJournalReader(_memstateSettings); while (true) { var lastRecordId = from; var records = reader.GetRecords(lastRecordId); foreach (var record in records) { lastRecordId = record.RecordNumber; try { _handler(record); } catch (Exception exception) { _log.LogError(exception, $"Exception occured in {GetType().Name}.CatchUp"); } } lock (Lock) { if (_buffer.TryPeek(out var queuedRecord)) { if (queuedRecord.RecordNumber <= lastRecordId) { // Caught up while (_buffer.TryDequeue(out queuedRecord)) { try { _handler(queuedRecord); } catch (Exception exception) { _log.LogError(exception, $"Exception occured in {GetType().Name}.CatchUp"); } } } } else { _ready = true; return; } } } }
private void Reader() { while (!_disposed) { foreach (var record in _journalReader.GetRecords(_nextRecordId)) { _nextRecordId++; _handler.Invoke(record); } _ready = true; _readWaiter.WaitOne(TimeSpan.FromSeconds(1)); } }