Esempio n. 1
0
        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();
            }
        }
Esempio n. 2
0
        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();
            }
        }