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));
            }
        }