Example #1
0
        public CheckpointTag MakeCheckpointTag(ProjectionMessage.Projections.CommittedEventDistributed committedEvent)
        {
            // this is the same tag that will be generated by Handle(CommittedEventDistributed)
            var tag = _positionTagger.MakeCheckpointTag(_positionTracker.LastTag, committedEvent);

            return(tag);
        }
 private void DistributeMessage(ProjectionMessage.Projections.CommittedEventDistributed message)
 {
     foreach (var subscriber in _headSubscribers.Values)
     {
         subscriber.Handle(message);
     }
 }
        private bool TrySubscribeHeadingDistributionPoint(
            ProjectionMessage.Projections.CommittedEventDistributed message, Guid projectionId)
        {
            if (_pausedProjections.Contains(projectionId))
            {
                return(false);
            }

            var projectionSubscription = _subscriptions[projectionId];

            if (!_headingEventDistributionPoint.TrySubscribe(
                    projectionId, projectionSubscription, projectionSubscription.MakeCheckpointTag(message)))
            {
                return(false);
            }

            if (message.Data == null)
            {
                _logger.Trace("The '{0}' is subscribing to the heading distribution point with TF-EOF marker event at '{1}'", projectionId, message.Position);
            }

            Guid distributionPointId = message.CorrelationId;

            _distributionPoints[distributionPointId].Dispose();
            _distributionPoints.Remove(distributionPointId);
            _distributionPointSubscriptions.Remove(distributionPointId);
            _projectionDistributionPoints[projectionId] = Guid.Empty;
            return(true);
        }
        public void Handle(ProjectionMessage.Projections.CommittedEventDistributed message)
        {
            Guid projectionId;

            if (_stopped)
            {
                return;
            }
            if (_headingEventDistributionPoint.Handle(message))
            {
                return;
            }
            if (!_distributionPointSubscriptions.TryGetValue(message.CorrelationId, out projectionId))
            {
                return; // unsubscribed
            }
            if (TrySubscribeHeadingDistributionPoint(message, projectionId))
            {
                return;
            }
            if (message.Data != null) // means notification about the end of the stream/source
            {
                _subscriptions[projectionId].Handle(message);
            }
        }
Example #5
0
 public override CheckpointTag MakeCheckpointTag(CheckpointTag previous, ProjectionMessage.Projections.CommittedEventDistributed comittedEvent)
 {
     if (comittedEvent.PositionStreamId != _stream)
     {
         throw new InvalidOperationException(string.Format("Invalid stream '{0}'.  Expected stream is '{1}'", comittedEvent.EventStreamId, _stream));
     }
     return(CheckpointTag.FromStreamPosition(comittedEvent.PositionStreamId, comittedEvent.PositionSequenceNumber, comittedEvent.Position.PreparePosition));
 }
 private void ValidateEventOrder(ProjectionMessage.Projections.CommittedEventDistributed message)
 {
     if (_lastEventPosition >= message.Position)
     {
         throw new InvalidOperationException(
                   string.Format(
                       "Invalid committed event order.  Last: '{0}' Received: '{1}'", _lastEventPosition,
                       message.Position));
     }
     _lastEventPosition = message.Position;
 }
        private void CacheRecentMessage(ProjectionMessage.Projections.CommittedEventDistributed message)
        {
            _lastMessages.Enqueue(message);
            if (_lastMessages.Count > _eventCacheSize)
            {
                _lastMessages.Dequeue();
            }
            var lastAvailableCommittedevent = _lastMessages.Peek();

            _subscribeFromPosition = lastAvailableCommittedevent.Position;
        }
Example #8
0
        public void Handle(ProjectionMessage.Projections.CommittedEventDistributed message)
        {
            if (message.Data == null)
            {
                throw new NotSupportedException();
            }

            // NOTE: we may receive here messages from heading event distribution point
            // and they may not pass out source filter.  Discard them first
            if (!_eventFilter.PassesSource(message.ResolvedLinkTo, message.PositionStreamId))
            {
                return;
            }
            var eventCheckpointTag = _positionTagger.MakeCheckpointTag(_positionTracker.LastTag, message);

            //TODO: when joining heading distribution point replayed events may cause invalid operation exception on comparison
            if (eventCheckpointTag <= _positionTracker.LastTag)
            {
                _logger.Trace(
                    "Skipping replayed event {0}@{1} at position {2}. the last processed event checkpoint tag is: {3}",
                    message.PositionSequenceNumber, message.PositionStreamId, message.Position, _positionTracker.LastTag);
                return;
            }
            _positionTracker.UpdateByCheckpointTagForward(eventCheckpointTag);
            if (_eventFilter.Passes(message.ResolvedLinkTo, message.PositionStreamId, message.Data.EventType))
            {
                _lastPassedOrCheckpointedEventPosition = message.Position;
                var convertedMessage =
                    ProjectionMessage.Projections.CommittedEventReceived.FromCommittedEventDistributed(message, eventCheckpointTag);
                _eventHandler.Handle(convertedMessage);
            }
            else
            {
                if (_checkpointUnhandledBytesThreshold != null &&
                    message.Position.CommitPosition - _lastPassedOrCheckpointedEventPosition.CommitPosition
                    > _checkpointUnhandledBytesThreshold)
                {
                    _lastPassedOrCheckpointedEventPosition = message.Position;
                    _checkpointHandler.Handle(
                        new ProjectionMessage.Projections.CheckpointSuggested(
                            _projectionCorrelationId, _positionTracker.LastTag));
                }
            }
        }
        public bool Handle(ProjectionMessage.Projections.CommittedEventDistributed message)
        {
            EnsureStarted();
            if (message.CorrelationId != _distributionPointId)
            {
                return(false);
            }
            if (message.Data == null)
            {
                return(true);
            }
            ValidateEventOrder(message);

            CacheRecentMessage(message);
            DistributeMessage(message);
            if (_headSubscribers.Count == 0 && !_headDistributionPointPaused)
            {
                _headDistributionPoint.Pause();
                _headDistributionPointPaused = true;
            }
            return(true);
        }
 public CheckpointTag MakeCheckpointTag(ProjectionMessage.Projections.CommittedEventDistributed committedEvent)
 {
     return(CheckpointTag.FromStreamPosition(
                committedEvent.PositionStreamId, committedEvent.EventSequenceNumber,
                committedEvent.Position.PreparePosition));
 }
 public void Handle(ProjectionMessage.Projections.CommittedEventDistributed message)
 {
     _receivedEvents.Add(message);
 }
Example #12
0
 public virtual CheckpointTag MakeCheckpointTag(CheckpointTag previous, ProjectionMessage.Projections.CommittedEventDistributed comittedEvent)
 {
     return(new CheckpointTag(comittedEvent.Position));
 }