public void Handle(ReaderSubscriptionManagement.Pause message) { if (!_pausedSubscriptions.Add(message.SubscriptionId)) { throw new InvalidOperationException("Already paused projection"); } IReaderSubscription projectionSubscription; if (!_subscriptions.TryGetValue(message.SubscriptionId, out projectionSubscription)) { return; // may be already unsubscribed when self-unsubscribing } var eventReaderId = _subscriptionEventReaders[message.SubscriptionId]; if (eventReaderId == Guid.Empty) // head { _subscriptionEventReaders.Remove(message.SubscriptionId); _headingEventReader.Unsubscribe(message.SubscriptionId); var forkedEventReaderId = Guid.NewGuid(); var forkedEventReader = projectionSubscription.CreatePausedEventReader( _publisher, _ioDispatcher, forkedEventReaderId); _subscriptionEventReaders.Add(message.SubscriptionId, forkedEventReaderId); _eventReaderSubscriptions.Add(forkedEventReaderId, message.SubscriptionId); _eventReaders.Add(forkedEventReaderId, forkedEventReader); _publisher.Publish( new EventReaderSubscriptionMessage.ReaderAssignedReader( message.SubscriptionId, forkedEventReaderId)); } else { _eventReaders[eventReaderId].Pause(); } }
public void Handle(ReaderSubscriptionManagement.Pause message) { if (!_pausedSubscriptions.Add(message.SubscriptionId)) { throw new InvalidOperationException("Already paused projection"); } var projectionSubscription = _subscriptions[message.SubscriptionId]; var eventReaderId = _subscriptionEventReaders[message.SubscriptionId]; if (eventReaderId == Guid.Empty) // head { _subscriptionEventReaders.Remove(message.SubscriptionId); _headingEventReader.Unsubscribe(message.SubscriptionId); var forkedEventReaderId = Guid.NewGuid(); var forkedEventReader = projectionSubscription.CreatePausedEventReader(_publisher, forkedEventReaderId); _subscriptionEventReaders.Add(message.SubscriptionId, forkedEventReaderId); _eventReaderSubscriptions.Add(forkedEventReaderId, message.SubscriptionId); _eventReaders.Add(forkedEventReaderId, forkedEventReader); _publisher.Publish( new ReaderSubscriptionManagement.ReaderAssignedReader(message.SubscriptionId, forkedEventReaderId)); } else { _eventReaders[eventReaderId].Pause(); } }