public override void PreStart() { var callback = GetAsyncCallback <(RedisChannel channel, string bs)>(data => { if (data.channel.Equals(_journalHelper.GetIdentifiersChannel())) { Log.Debug("Message received"); // enqueue the element _buffer.Enqueue(data.bs); // deliver element Deliver(); } else { Log.Debug($"Message from unexpected channel: {data.channel}"); } }); _subscription = _redis.GetSubscriber(); _subscription.Subscribe(_journalHelper.GetIdentifiersChannel(), (channel, value) => { callback.Invoke((channel, value)); }); }
#pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed private async Task WriteBatchAsync(AtomicWrite aw) { var transaction = Database.CreateTransaction(); var payloads = aw.Payload.AsInstanceOf <IImmutableList <IPersistentRepresentation> >(); foreach (var payload in payloads) { var(bytes, tags) = Extract(payload); // save the payload transaction.SortedSetAddAsync(_journalHelper.GetJournalKey(payload.PersistenceId), bytes, payload.SequenceNr); // notify about a new event being appended for this persistence id transaction.PublishAsync(_journalHelper.GetJournalChannel(payload.PersistenceId), payload.SequenceNr); // save tags foreach (var tag in tags) { transaction.ListRightPushAsync(_journalHelper.GetTagKey(tag), $"{payload.SequenceNr}:{payload.PersistenceId}"); transaction.PublishAsync(_journalHelper.GetTagsChannel(), tag); } } // set highest sequence number key transaction.StringSetAsync(_journalHelper.GetHighestSequenceNrKey(aw.PersistenceId), aw.HighestSequenceNr); // add persistenceId transaction.SetAddAsync(_journalHelper.GetIdentifiersKey(), aw.PersistenceId).ContinueWith(task => { if (task.Result) { // notify about a new persistenceId Database.Publish(_journalHelper.GetIdentifiersChannel(), aw.PersistenceId); } }); if (!await transaction.ExecuteAsync()) { throw new Exception($"{nameof(WriteMessagesAsync)}: failed to write {typeof(IPersistentRepresentation).Name} to redis"); } }