public Applied Load(ICollection <ICommand <IIdentity> > commands)
        {
            var id      = commands.First().Id;
            var stream  = _factory.GetOrCreateStream(IdentityConvert.ToStream(id));
            var records = stream.ReadRecords(0, int.MaxValue).ToList();
            var events  = records
                          .SelectMany(r => _streamer.ReadAsEnvelopeData(r.Data).Items.Select(m => (IEvent <IIdentity>)m.Content))
                          .ToArray();

            var then = new Applied();

            if (records.Count > 0)
            {
                then.Version = records.Last().Version;
            }

            var recipeId = id as RecipeId;

            if (recipeId != null)
            {
                var state = new RecipeAggregateState(events);
                var agg   = new RecipeAggregate(state, then.Events.Add);
                ExecuteSafely(agg, commands);
                return(then);
            }

            throw new NotSupportedException("identity not supported " + id);
        }
示例#2
0
        public static Action <ImmutableEnvelope> Route(Func <string, IQueueWriter> factory, IEnvelopeStreamer serializer,
                                                       ITapeStorageFactory tapes)
        {
            var events      = factory(EventsQueue);
            var timerQueue  = factory(TimerQueue);
            var entityQueue = factory(EntityQueue);
            var services    = factory(ServiceQueue);
            var log         = tapes.GetOrCreateStream(DomainLogName);

            return(envelope =>
            {
                var data = serializer.SaveEnvelopeData(envelope);
                if (!log.TryAppend(data))
                {
                    throw new InvalidOperationException("Failed to record domain log");
                }

                if (envelope.DeliverOnUtc > Current.UtcNow)
                {
                    timerQueue.PutMessage(data);
                    return;
                }
                if (envelope.Items.All(i => i.Content is ICommand <IIdentity>))
                {
                    entityQueue.PutMessage(data);
                    return;
                }
                if (envelope.Items.All(i => i.Content is IEvent <IIdentity>))
                {
                    // we can have more than 1 entity event.
                    // all entity events are routed to events as separate
                    for (int i = 0; i < envelope.Items.Length; i++)
                    {
                        var name = envelope.EnvelopeId + "-e" + i;
                        var copy = EnvelopeBuilder.CloneProperties(name, envelope);
                        copy.AddItem(envelope.Items[i]);
                        events.PutMessage(serializer.SaveEnvelopeData(copy.Build()));
                    }
                    return;
                }

                if (envelope.Items.Length != 1)
                {
                    throw new InvalidOperationException(
                        "Only entity commands or entity events can be batched");
                }
                var item = envelope.Items[0].Content;
                if (item is IFunctionalCommand)
                {
                    services.PutMessage(data);
                    return;
                }
                if (item is IFunctionalEvent || item is ISampleEvent)
                {
                    events.PutMessage(data);
                    return;
                }
                throw new InvalidOperationException(string.Format("Unroutable message {0}", item));
            });
        }
        protected override ITapeStream InitializeAndGetTapeStorage()
        {
            var connectionString = Settings.Default.SqlConnectionString;
            var tableName = Settings.Default.SqlTapeWriterTableName;

            _storageFactory = new SqlTapeStorageFactory(connectionString, tableName);

            var count = 0;
            while (true)
            {
                count++;

                try
                {
                    _storageFactory.InitializeForWriting();
                    break;
                }
                catch (Exception)
                {
                    if (count < 1)
                    {
                        System.Threading.Thread.Sleep(500);
                        continue;
                    }

                    throw;
                }
            }

            const string name = "test";
            return _storageFactory.GetOrCreateStream(name);
        }
示例#4
0
        protected override ITapeStream InitializeAndGetTapeStorage()
        {
            _storageFactory = new FileTapeStorageFactory(_path);
            _storageFactory.InitializeForWriting();

            const string name = "test";

            return(_storageFactory.GetOrCreateStream(name));
        }
示例#5
0
        public static Action<ImmutableEnvelope> Route(Func<string, IQueueWriter> factory, IEnvelopeStreamer serializer,
            ITapeStorageFactory tapes)
        {
            var events = factory(EventsQueue);
            var timerQueue = factory(TimerQueue);
            var entityQueue = factory(EntityQueue);
            var services = factory(ServiceQueue);
            var log = tapes.GetOrCreateStream(DomainLogName);
            return envelope =>
                {
                    var data = serializer.SaveEnvelopeData(envelope);
                    if (!log.TryAppend(data))
                        throw new InvalidOperationException("Failed to record domain log");

                    if (envelope.DeliverOnUtc > Current.UtcNow)
                    {
                        timerQueue.PutMessage(data);
                        return;
                    }
                    if (envelope.Items.All(i => i.Content is ICommand<IIdentity>))
                    {
                        entityQueue.PutMessage(data);
                        return;
                    }
                    if (envelope.Items.All(i => i.Content is IEvent<IIdentity>))
                    {
                        // we can have more than 1 entity event.
                        // all entity events are routed to events as separate
                        for (int i = 0; i < envelope.Items.Length; i++)
                        {
                            var name = envelope.EnvelopeId + "-e" + i;
                            var copy = EnvelopeBuilder.CloneProperties(name, envelope);
                            copy.AddItem(envelope.Items[i]);
                            events.PutMessage(serializer.SaveEnvelopeData(copy.Build()));
                        }
                        return;
                    }

                    if (envelope.Items.Length != 1)
                    {
                        throw new InvalidOperationException(
                            "Only entity commands or entity events can be batched");
                    }
                    var item = envelope.Items[0].Content;
                    if (item is IFunctionalCommand)
                    {
                        services.PutMessage(data);
                        return;
                    }
                    if (item is IFunctionalEvent || item is ISampleEvent)
                    {
                        events.PutMessage(data);
                        return;
                    }
                    throw new InvalidOperationException(string.Format("Unroutable message {0}", item));
                };
        }
        protected override ITapeStream InitializeAndGetTapeStorage()
        {
            var config = AzureStorage.CreateConfig(_cloudStorageAccount);
            _storageFactory = new BlobTapeStorageFactory(config, ContainerName);
            _storageFactory.InitializeForWriting();

            const string name = "test";

            return _storageFactory.GetOrCreateStream(name);
        }
示例#7
0
        protected override ITapeStream InitializeAndGetTapeStorage()
        {
            var config = AzureStorage.CreateConfig(_cloudStorageAccount);

            _storageFactory = new BlobTapeStorageFactory(config, ContainerName);
            _storageFactory.InitializeForWriting();

            const string name = "test";

            return(_storageFactory.GetOrCreateStream(name));
        }
示例#8
0
        protected override ITapeStream InitializeAndGetTapeStorage()
        {
            var connectionString = Settings.Default.SqlConnectionString;
            var tableName        = Settings.Default.SqlTapeWriterTableName;

            _storageFactory = new SqlTapeStorageFactory(connectionString, tableName);

            var count = 0;

            while (true)
            {
                count++;

                try
                {
                    _storageFactory.InitializeForWriting();
                    break;
                }
                catch (Exception)
                {
                    if (count < 1)
                    {
                        System.Threading.Thread.Sleep(500);
                        continue;
                    }

                    throw;
                }
            }



            const string name = "test";

            return(_storageFactory.GetOrCreateStream(name));
        }
        void Dispatch(string id, IEnumerable <ICommand> commands)
        {
            var stream = _factory.GetOrCreateStream(id);

            var records = stream.ReadRecords(0, int.MaxValue).ToList();
            var events  = records
                          .Select(tr => _streamer.ReadAsEnvelopeData(tr.Data))
                          .SelectMany(i => i.Items)
                          .Select(i => (IEvent)i.Content)
                          .ToList();

            var then = AggregateFactory
                       .LoadProject(events, commands)
                       .Select(e => new MessageBuilder(e.GetType(), e)).ToList();

            if (then.Count == 0)
            {
                return;
            }


            // events are stored here as envelopes )
            var b = new EnvelopeBuilder("unknown");

            foreach (var e in then)
            {
                b.Items.Add(e);
            }

            var version = records.Count == 0 ? 0 : records.Last().Version;

            var data   = _streamer.SaveEnvelopeData(b.Build());
            var result = stream.TryAppend(data, TapeAppendCondition.VersionIs(version));

            if (!result)
            {
                throw new InvalidOperationException(
                          "Data was modified concurrently, and we don't have merging implemented, yet");
            }

            var args = _path.Split(':');
            IQueueWriterFactory factory;

            if (!_queue.TryGet(args[0], out factory))
            {
                throw new InvalidOperationException("Not found " + _path);
            }


            var arVersion = events.Count + 1;
            var arName    = id;

            for (int i = 0; i < then.Count; i++)
            {
                var name    = string.Format("{0}/{1}/{2}", arName, arVersion, i);
                var builder = new EnvelopeBuilder(name);


                builder.Items.Add(then[i]);
                builder.AddString("from-entity", arName);

                factory.GetWriteQueue(args[1]).PutMessage(builder.Build());
            }
        }
        protected override ITapeStream InitializeAndGetTapeStorage()
        {
            _storageFactory = new FileTapeStorageFactory(_path);
            _storageFactory.InitializeForWriting();

            const string name = "test";
            return _storageFactory.GetOrCreateStream(name);
        }