コード例 #1
0
 public void Commit(Guid guid)
 {
     using (IEventStream stream = _store.OpenStream(guid, 0, int.MaxValue))
     {
         stream.CommitChanges(Guid.NewGuid());
     }
 }
コード例 #2
0
        protected override Task <int> SaveChanges(ItemWithType[] newEvents,
                                                  TState currentState,
                                                  CancellationToken?cancellationToken)
        {
            for (var index = 0; index < newEvents.Length; index++)
            {
                eventStream.Add(new EventMessage()
                {
                    Body    = newEvents[index].instance,
                    Headers = new Dictionary <string, object>
                    {
                        { "EventType", newEvents[index].type }
                    }
                });
            }

            try
            {
                eventStream.CommitChanges(Guid.NewGuid());
            }

            catch (ConcurrencyException nce)
            {
                throw new Exceptions.ConcurrencyException(eventStream.StreamId, nce);
            }

            return(Task.FromResult(eventStream.StreamRevision));
        }
コード例 #3
0
 // Header of stream (like NEeventStore does). See: https://github.com/NEventStore/NEventStore/blob/master/src/NEventStore/CommonDomain/Persistence/EventStore/EventStoreRepository.cs#L197
 public static void AddMigrationCommit(this IEventStream stream, Type mementoType, object @event)
 {
     stream.UncommittedHeaders[AggregateTypeHeader] = mementoType.FullName.Replace("Memento", "");
     stream.Add(new EventMessage {
         Body = @event
     });
     stream.CommitChanges(Guid.NewGuid());
 }
コード例 #4
0
 public void AppendToStream(IEvent @event)
 {
     using (IEventStream stream = _store.OpenStream(@event.Guid, 0, int.MaxValue))
     {
         stream.Add(new EventMessage {
             Body = @event
         });
         stream.CommitChanges(Guid.NewGuid());
     }
 }
コード例 #5
0
 private static void CommitOneValue(IEventStream stream, int value)
 {
     stream.Add(new EventMessage()
     {
         Body = new TestDomainEvent()
         {
             Value = value
         }
     });
     stream.CommitChanges(Guid.NewGuid());
 }
コード例 #6
0
        private static void OnSoldierCreateEvent(SoldierCreatedEvent createSoldier)
        {
            using (IEventStream stream = _store.OpenStream(_castleId))
            {
                var @event = new CreateSoldierEvent(Guid.NewGuid(), ProductionTime);

                stream.Add(new EventMessage {
                    Body = @event
                });
                stream.CommitChanges(Guid.NewGuid());
            }
        }
コード例 #7
0
        public void LoadFromSnapshotForwardAndAppend(IEvent @event)
        {
            var latestSnapshot = _store.Advanced.GetSnapshot(@event.Guid, 0);

            using (IEventStream stream = _store.OpenStream(latestSnapshot, int.MaxValue))
            {
                stream.Add(new EventMessage {
                    Body = @event
                });
                stream.CommitChanges(Guid.NewGuid());
            }
        }
コード例 #8
0
 private static void CreateGame()
 {
     using (IEventStream stream = _store.OpenStream(_gameId, 0))
     {
         // create game
         var @event = new CreateGameEvent();
         stream.Add(new EventMessage {
             Body = @event
         });
         stream.CommitChanges(Guid.NewGuid());
     }
     CreateCastle(_castleId);
 }
コード例 #9
0
 public void AppendToStream(IList <IEvent> @events)
 {
     using (IEventStream stream = _store.OpenStream(@events.FirstOrDefault().Guid, 0, int.MaxValue))
     {
         foreach (var @event in @events)
         {
             stream.Add(new EventMessage {
                 Body = @event
             });
         }
         stream.CommitChanges(Guid.NewGuid());
     }
 }
コード例 #10
0
 public void OpenOrCreateStream(IEvent @event)
 {
     // we can call CreateStream(StreamId) if we know there isn't going to be any data.
     // or we can call OpenStream(StreamId, 0, int.MaxValue) to read all commits,
     // if no commits exist then it creates a new stream for us.
     using (IEventStream stream = _store.OpenStream(@event.Guid, 0, int.MaxValue))
     {
         stream.Add(new EventMessage {
             Body = @event
         });
         stream.CommitChanges(Guid.NewGuid());
     }
 }
コード例 #11
0
        private static void CreateSoldier()
        {
            Console.WriteLine("Create soldier");
            using (IEventStream stream = _store.OpenStream(_castleId, 0))
            {
                var @event = new CreateSoldierEvent(Guid.NewGuid(), ProductionTime);

                stream.Add(new EventMessage {
                    Body = @event
                });
                stream.CommitChanges(Guid.NewGuid());
            }
        }
コード例 #12
0
 private static void CreateCastle(Guid castleId)
 {
     Console.WriteLine("Create castle");
     using (IEventStream stream = _store.OpenStream(castleId, 0))
     {
         // create game
         var @event = new CreateCastleEvent();
         stream.Add(new EventMessage {
             Body = @event
         });
         stream.CommitChanges(Guid.NewGuid());
     }
     CreateSoldier();
 }
        private Task PopulateMaster()
        {
            IEventStream stream = _master.CreateStream("tweets");

            IEnumerable <Task> tasks = ReadTweets().Select(tweet =>
            {
                var message = new TweetMessage(tweet);
                stream.Add(new EventMessage {
                    Body = message
                });
                return(stream.CommitChanges(Guid.NewGuid()));
            });

            return(Task.WhenAll(tasks));
        }
コード例 #14
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="bucketId"></param>
        /// <param name="aggregate"></param>
        /// <param name="commitId"></param>
        /// <param name="updateHeaders"></param>
        /// <returns></returns>
        public Int32 Save(string bucketId, IAggregateEx aggregate, Guid commitId, Action <IDictionary <string, object> > updateHeaders)
        {
            if (_disposed)
            {
                throw new ObjectDisposedException("This instance of repository was already disposed");
            }

            Dictionary <string, object> headers = PrepareHeaders(aggregate, updateHeaders);
            Int32 uncommittedEvents             = aggregate.GetUncommittedEvents().Count;

            while (true)
            {
                IEventStream stream           = this.PrepareStream(bucketId, aggregate, headers);
                int          commitEventCount = stream.CommittedEvents.Count;

                try
                {
                    stream.CommitChanges(commitId);
                    aggregate.ClearUncommittedEvents();
                    return(uncommittedEvents);
                }
                catch (DuplicateCommitException dex)
                {
                    stream.ClearChanges();
                    _logger.Debug(String.Format("Duplicate commit exception bucket {0} - id {1} - commitid {2}. \n{3}", bucketId, aggregate.Id, commitId, dex));
                    return(0); //no events commited
                }
                catch (ConcurrencyException e)
                {
                    _logger.Warn(String.Format("Concurrency Exception bucket {0} - id {1} - commitid {2}. \n{3}", bucketId, aggregate.Id, commitId, e));
                    if (this.ThrowOnConflict(stream, commitEventCount))
                    {
                        //@@FIX -> aggiungere prima del lancio dell'eccezione
                        stream.ClearChanges();
                        throw new ConflictingCommandException(e.Message, e);
                    }
                    stream.ClearChanges();
                }
                catch (StorageException e)
                {
                    throw new PersistenceException(e.Message, e);
                }
                finally
                {
                    ReleaseAggregateId(aggregate.Id);
                }
            }
        }
コード例 #15
0
 void CommitStream(Guid commitId, IEventStream toCommit)
 {
     try
     {
         toCommit.CommitChanges(commitId);
     }
     catch (DuplicateCommitException)
     {
         toCommit.ClearChanges();
     }
     catch (ConcurrencyException)
     {
         toCommit.ClearChanges();
         throw;
     }
 }
コード例 #16
0
        public async Task When_new_commit_then_should_dispatch()
        {
            using (IStoreEvents eventStore = Wireup.Init().UsingInMemoryPersistence().Build())
            {
                var dispatchedEvents = new List <EventMessage <TestEvent> >();
                var handlerModule    = new TestHandlerModule(dispatchedEvents);

                using (var host = new DurableCommitDispatcher(
                           new EventStoreClient(eventStore.Advanced),
                           new InMemoryCheckpointRepository(),
                           new HandlerResolver(handlerModule)))
                {
                    var projectedCommits = host
                                           .ProjectedCommits
                                           .Replay();

                    using (projectedCommits.Connect())
                    {
                        await host.Start();

                        var streamId = Guid.NewGuid().ToString().FormatStreamIdWithBucket();

                        Guid commitId = Guid.NewGuid();

                        Task <ICommit> commitProjected = projectedCommits
                                                         .Take(1)
                                                         .ToTask();

                        using (IEventStream stream = eventStore.CreateStream(streamId))
                        {
                            stream.Add(new global::NEventStore.EventMessage {
                                Body = new TestEvent()
                            });
                            stream.CommitChanges(commitId);
                        }
                        host.PollNow();
                        await commitProjected;

                        dispatchedEvents.Count.Should().Be(1);
                        dispatchedEvents[0].Commit().Should().NotBeNull();
                        dispatchedEvents[0].Headers.Should().NotBeNull();
                        dispatchedEvents[0].Version.Should().Be(1);
                        dispatchedEvents[0].DomainEvent.Should().BeOfType <TestEvent>();
                    }
                }
            }
        }
コード例 #17
0
        public async Task When_handler_throws_Then_invoke_exception_callback()
        {
            using (IStoreEvents eventStore = Wireup.Init().UsingInMemoryPersistence().Build())
            {
                var projectedEvents = new List <EventMessage <TestEvent> >();
                var handlerModule   = new TestHandlerModule(projectedEvents);

                using (var host = new DurableCommitDispatcher(
                           new EventStoreClient(eventStore.Advanced),
                           new InMemoryCheckpointRepository(),
                           new HandlerResolver(handlerModule)))
                {
                    var projectedCommits = host
                                           .ProjectedCommits
                                           .Replay();

                    using (projectedCommits.Connect())
                    {
                        await host.Start();

                        var streamId = Guid.NewGuid().ToString().FormatStreamIdWithBucket();

                        Guid commitId = Guid.NewGuid();

                        Task <ICommit> commitProjected = projectedCommits
                                                         .Take(1)
                                                         .ToTask();

                        using (IEventStream stream = eventStore.CreateStream(streamId))
                        {
                            stream.Add(new global::NEventStore.EventMessage {
                                Body = new TestEventThatThrows()
                            });
                            stream.CommitChanges(commitId);
                        }
                        host.PollNow();

                        Func <Task> act = async() => await commitProjected;

                        act.ShouldThrow <Exception>();
                    }
                }
            }
        }
コード例 #18
0
        public void Save(string bucketId, IAggregateEx aggregate, Guid commitId, Action <IDictionary <string, object> > updateHeaders)
        {
            Dictionary <string, object> headers = PrepareHeaders(aggregate, updateHeaders);

            while (true)
            {
                IEventStream stream           = this.PrepareStream(bucketId, aggregate, headers);
                int          commitEventCount = stream.CommittedEvents.Count;

                try
                {
                    stream.CommitChanges(commitId);
                    aggregate.ClearUncommittedEvents();
                    return;
                }
                catch (DuplicateCommitException)
                {
                    stream.ClearChanges();
                    return;
                }
                catch (ConcurrencyException e)
                {
                    if (this.ThrowOnConflict(stream, commitEventCount))
                    {
                        //@@FIX -> aggiungere prima del lancio dell'eccezione
                        stream.ClearChanges();
                        throw new ConflictingCommandException(e.Message, e);
                    }
                    stream.ClearChanges();
                }
                catch (StorageException e)
                {
                    throw new PersistenceException(e.Message, e);
                }
                finally
                {
                    ReleaseAggregateId(aggregate.Id);
                }
            }
        }