예제 #1
0
        private async Task BuildProjections()
        {
            foreach (var projection in _projections)
            {
                var offset = await projection.Offset();

                var @from = offset + 1;

                var events = await _eventStream
                             .Load(@from, _configuration.BatchSize) ?? new List <IDomainEvent>();

                var i         = 0;
                var lastEvent = events.Count;

                foreach (var @event in events)
                {
                    i++;

                    try
                    {
                        await projection.HandleEvent(@event, i == lastEvent);
                    }
                    catch (Exception ex)
                    {
                        HandleException(new AggregateException(new[]
                        {
                            new Exception($"ProjectionAgent: Unable to apply {@event.GetType().Name} event for {projection.GetType().Name} projection: {ex.Message}"),
                            ex
                        }));

                        return;
                    }
                }
            }
        }
예제 #2
0
        private void BuildProjections()
        {
            foreach (var projection in _projections)
            {
                var offset = projection.Offset().GetAwaiter().GetResult();

                var @from = offset + 1;

                var events = _eventStream
                             .Load(@from, _configuration.BatchSize, projection.Subscriptions())
                             .GetAwaiter()
                             .GetResult() ?? new List <IDomainEvent>();

                foreach (var @event in events)
                {
                    try
                    {
                        if (!_isActive)
                        {
                            ResetProjections();

                            return;
                        }

                        projection.HandleEvent(@event).GetAwaiter().GetResult();
                    }
                    catch (Exception ex)
                    {
                        HandleException(new AggregateException(new[]
                        {
                            new Exception($"ProjectionAgent: Unable to apply {@event.GetType().Name} event for {projection.GetType().Name} projection: {ex.Message}"),
                            ex
                        }));

                        break;
                    }
                }
            }
        }