Ejemplo n.º 1
0
        public void SqlEventStore_Deserializes_Events()
        {
            var id     = Guid.NewGuid();
            var events = new List <EventStream>
            {
                new EventStream
                {
                    AggregateRootId = id,
                    DateCreated     = DateTime.Now,
                    EventData       = Resources.JsonSerializedDebitEvent,
                    Id            = 1,
                    SequenceStart = 2,
                    SequenceEnd   = 2
                },
                new EventStream
                {
                    AggregateRootId = id,
                    DateCreated     = DateTime.Now,
                    EventData       = Resources.JsonSerializedNewAccountEvent,
                    Id            = 1,
                    SequenceStart = 1,
                    SequenceEnd   = 1
                }
            };

            var database = new Mock <ISqlRepository>();

            database.Setup(db => db.GetEventStream(It.IsAny <Guid>(), It.IsAny <long>())).Returns(events);

            var store = new SqlEventStore
            {
                GetRepository = () => database.Object
            };

            var eventStream = store.GetEvents(id, 1).ToList();

            Assert.AreEqual(2, eventStream.Count());
            Assert.AreEqual(1, eventStream[0].Sequence);
            Assert.AreEqual(2, eventStream[1].Sequence);
            Assert.IsInstanceOf <AccountCreatedEvent>(eventStream[0]);
            Assert.IsInstanceOf <AccountDebitedEvent>(eventStream[1]);
        }
Ejemplo n.º 2
0
        public void be_reidrated_from_database()
        {
            var eventStore       = new SqlEventStore(new DomainEventJsonEventSerializer(), new FakeEventStamping());
            var eventBus         = new EventBus(new EventDispatcher(), eventStore);
            var createdStagiaire = Student.Create("BOUDOUX", "Aurelien");

            eventBus.Publish(createdStagiaire.UncommitedEvents);

            var studentId = createdStagiaire.AggregateId;
            var events    = eventStore.GetEvents(studentId);
            var student   = new Student(new History(events));

            student.Update("BOUDOUX", "Aurélien");
            eventBus.Publish(student.UncommitedEvents);

            var student1 = new Student(new History(eventStore.GetEvents(studentId)));

            student1.Update("BOUDOUX", "Aurélien");
            student1.UncommitedEvents.GetStream().Should().BeEmpty();
        }
Ejemplo n.º 3
0
        public static async Task Main(string[] args)
        {
            JsonSerializerSettings _jsonSerializerSettings = new JsonSerializerSettings()
            {
                TypeNameHandling  = TypeNameHandling.All,
                NullValueHandling = NullValueHandling.Ignore
            };
            string   exchangeName    = "CustomerManagement";
            var      eventRepository = new SqlEventStore();
            DateTime fromDateTime    = DateTime.Now.AddDays(-100);
            var      factory         = new ConnectionFactory()
            {
                HostName = "10.100.8.67", Port = 5672, UserName = "******", Password = "******"
            };

            using (var connection = factory.CreateConnection())
                using (var channel = connection.CreateModel())
                {
                    channel.ExchangeDeclare(exchange: exchangeName, type: ExchangeType.Fanout);

                    do
                    {
                        var events = await eventRepository.GetAll(fromDateTime);

                        if (events?.Any() == true)
                        {
                            fromDateTime = events.Last().CreatedAt;
                        }
                        foreach (var item in events)
                        {
                            var domainEvent = JsonConvert.DeserializeObject(item.Data, _jsonSerializerSettings);
                            var body        = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(domainEvent));
                            channel.BasicPublish(exchange: exchangeName,
                                                 routingKey: item.Name,
                                                 basicProperties: null,
                                                 body: body);
                        }
                        System.Threading.Thread.Sleep(1000);
                    } while (true);
                }
        }
Ejemplo n.º 4
0
        private static async Task AppendBenchmark2Async(Func <ISqlEventStore, ISqlEventStore> configuration, int batchSize, TimeSpan timeout)
        {
            using (var db = new SqlLocalDB())
            {
                var es = new SqlEventStore(db.ConnectionString);

                await es.Database.InitializeAsync();

                var list = new List <UncommittedEvent>();

                var sw = new Stopwatch();

                var es2 = configuration(es);

                int n = 0;
                foreach (var e in GetUncommittedSource(1000, 100000))
                {
                    list.Add(e);

                    if (!(list.Count < batchSize))
                    {
                        var batch = list.ToArray();
                        n += batch.Length;
                        list.Clear();

                        sw.Start();

                        await es2.AppendAsync(batch);

                        sw.Stop();

                        if (!(sw.Elapsed < timeout))
                        {
                            break;
                        }
                    }
                }

                Console.WriteLine($"{n / sw.Elapsed.TotalSeconds:N1} op/s");
            }
        }
Ejemplo n.º 5
0
        public static void Run(string connStr)
        {
            IMessageSender  sender     = new SqlMessageSender(connStr, "dbo.messages");
            ITextSerializer serializer = new JsonTextSerializer();
            IEventStore     eventStore = new SqlEventStore(connStr, "dbo.events");

            IEventBus         eventBus     = new EventBus(sender, serializer);
            IMetadataProvider metaProvider = new StandardMetadataProvider();

            IEventSourcedRepository <AppointmentAggregate> repo = new
                                                                  EventSourcedRepository <AppointmentAggregate>(eventStore, eventBus, serializer, metaProvider);
            ICommandDispatcher cmdDispatcher = new CommandDispatcher();

            cmdDispatcher.Register(new AppointmentCommandHandler(repo));

            IMessageReceiver cmdReceiver = new SqlMessageReceiver(connStr, "dbo.messages");

            CommandProcessor commandProcessor = new CommandProcessor(cmdReceiver, serializer, cmdDispatcher);

            commandProcessor.Start();
        }
Ejemplo n.º 6
0
        public void SqlEventStore_Serialized_Events()
        {
            var database = new Mock <ISqlRepository>();

            database.Setup(db => db.InsertEvents(It.IsAny <EventStream>()));

            var store = new SqlEventStore
            {
                GetRepository = () => database.Object
            };

            var events = new List <DomainEvent>
            {
                new AccountCreatedEvent(Guid.NewGuid(), 100),
                new AccountDebitedEvent(Guid.NewGuid(), 50)
            };

            store.Insert(Guid.NewGuid(), events);

            database.Verify(db => db.InsertEvents(It.IsAny <EventStream>()), Times.Once);
        }
        public void Init()
        {
            _guidGenerator = new SequentialAtEndGuidGenerator();

            MetaFactories.Add(new MetaFactory(new Meta("ApplicationName", "Tests")));
            MetaFactories.Add(new MetaFactory(new Meta("Username", "Tester")));

            var typeFactory = new DefaultTypeFactory(new MD5HashProvider(Encoding.UTF8));

            var hash = typeFactory.GetHash(typeof(Created));

            EventStore = new SqlEventStore(
                new JsonSerializer(),
                typeFactory,
                Encoding.UTF8,
                ConfigurationManager.ConnectionStrings["SqlEventStore"].ConnectionString);

            var streamProcessor = new EventStreamProcessor <AccountAggregateRoot, AccountState>(new AggregateRootBuilder <AccountAggregateRoot, AccountState>(), new AggregateRootStateBuilder <AccountState>());

            Repository = new EventStoreRepository <AccountAggregateRoot, AccountState>(EventStore, streamProcessor, _guidGenerator);
        }
        public void StoreFailsIfAggregeteTypesNotConsistentTest()
        {
            var testModel = new TestModel();

            var sqlEventStoreA = new SqlEventStore(connectionString);

            var events      = testModel.AllEvents.Where(e => e.AggregateId == testModel.AggregateIds.First());
            var aggregateId = events.First().AggregateId;

            sqlEventStoreA.Store(aggregateId, events);

            var commandId = Guid.NewGuid().ToString();

            var nextEvents = new List <IEvent>();

            var item = new StockItem("item", "123");

            nextEvents.Add(EventFactory.Default.CreateEvent <Location, AdjustedIn>(aggregateId, events.Last().AggregateVersion + 1, commandId, commandId, new AdjustedIn($"adjustment_{Guid.NewGuid()}", aggregateId, item)));
            nextEvents.Add(EventFactory.Default.CreateEvent <InventoryItem, InventoryItemCreated>(aggregateId, events.Last().AggregateVersion + 2, commandId, commandId, new InventoryItemCreated(aggregateId)));
            nextEvents.Add(EventFactory.Default.CreateEvent <Location, AdjustedIn>(aggregateId, events.Last().AggregateVersion + 3, commandId, commandId, new AdjustedIn($"adjustment_{Guid.NewGuid()}", aggregateId, item)));

            new SqlEventStore(connectionString).Store(aggregateId, nextEvents);
        }
Ejemplo n.º 9
0
        public static void Run(string connStr)
        {
            IMessageSender  sender     = new SqlMessageSender(connStr, "dbo.messages");
            ITextSerializer serializer = new JsonTextSerializer();

            IEventStore       eventStore   = new SqlEventStore(connStr, "dbo.events");
            IEventBus         eventBus     = new EventBus(sender, serializer);
            IMetadataProvider metaProvider = new StandardMetadataProvider();
            IReadModelStorage <AppointmentReadModel> readModelStorage = new InMemeoryStorage <AppointmentReadModel>();

            IEventSourcedRepository <AppointmentAggregate> repo = new
                                                                  EventSourcedRepository <AppointmentAggregate>(eventStore, eventBus, serializer, metaProvider);

            IEventDispatcher evtDispatcher = new EventDispatcher();

            evtDispatcher.Register(new AppointmentEventHandler(readModelStorage));

            var evtReceiver = new SqlEventReceiver(new SqlEventStore(connStr, "dbo.events"));

            var eventProcessor = new EventProcessor(evtReceiver, serializer, evtDispatcher);

            eventProcessor.Start();
        }
Ejemplo n.º 10
0
        static void Main(string[] args)
        {
            Initialize();

            OptionSet p = new OptionSet()
              .Add("u", u => update = true);
            try
            {
                p.Parse(args);
            }
            catch (OptionException ex)
            {
                Console.WriteLine(ex.Message);
            }

            if (update)
            {
                var eventStore = new SqlEventStore(ServiceLocator.GetInstance<ITextSerializer>(), ServiceLocator.GetInstance<IEventBus>());
                eventStore.Advanced.ReplayEvents();
            }

            Console.ReadLine();
        }
Ejemplo n.º 11
0
        public async Task TestMethod1()
        {
            var streamId = Guid.NewGuid();
            var created  = DateTimeOffset.Now;

            var EventStore = new SqlEventStore(@"Server=tcp:wtxqsopwyb.database.windows.net,1433;Initial Catalog=event-store;Persist Security Info=False;User ID=john;Password=YCWJ^QNMZmmDF36F;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;");

            await EventStore.Database.InitializeAsync();

            // see https://docs.microsoft.com/en-us/azure/sql-database/sql-database-dtu-resource-limits

            // S0
            //await ForEachAsync(GetTestDataStream(10000), e => EventStore.AppendAsync(new[] { e }), 60);

            // S3
            //await ForEachAsync(GetTestDataStream(10000), e => EventStore.AppendAsync(new[] { e }), 200);

            // S6
            //await ForEachAsync(GetTestDataStream(10000), e => EventStore.AppendAsync(new[] { e }), 200);

            // S9
            await ForEachAsync(GetTestDataStream(10000), e => EventStore.AppendAsync(new[] { e }), 400);
        }
Ejemplo n.º 12
0
        public static void Main(string[] args)
        {
            using (var activator = new BuiltinHandlerActivator())
            {
                var commandHandlers = new CommandHandlers();

                activator.Handle <CreateInventoryItem>(commandHandlers.Handle);
                activator.Handle <CheckInItemsToInventory>(commandHandlers.Handle);
                activator.Handle <DeactivateInventoryItem>(commandHandlers.Handle);
                activator.Handle <RemoveItemsFromInventory>(commandHandlers.Handle);
                activator.Handle <RenameInventoryItem>(commandHandlers.Handle);

                var serverBus = Configure.With(activator)
                                .Transport(t => t.UseRabbitMq(rabbitMqConnectionString, "server"))
                                .Start();

                var eventStore = new SqlEventStore(sqlConnectionString, serverBus);
                var repository = new Repository <InventoryItem>(eventStore);

                commandHandlers.Repository = repository;
                serverBus.Subscribe <CreateInventoryItem>();
                serverBus.Subscribe <CheckInItemsToInventory>();
                serverBus.Subscribe <DeactivateInventoryItem>();
                serverBus.Subscribe <RemoveItemsFromInventory>();
                serverBus.Subscribe <RenameInventoryItem>();

                while (true)
                {
                    var key = Console.ReadKey();
                    if (key.KeyChar == 'q')
                    {
                        break;
                    }
                }
            }
        }
Ejemplo n.º 13
0
        public void save_event_in_database()
        {
            var store = new SqlEventStore(new DomainEventJsonEventSerializer(), new FakeEventStamping());

            store.Save(new SqlTestEvent(Guid.NewGuid(), 1, "test"));
        }
 public void CanSafelyCallDisposeMultipleTimes()
 {
     using (var snapshotStore = new SqlEventStore(new SqlEventStoreDialect(SqlServerConnection.Name), new BinarySerializer(), new EventStoreSettings()))
     {
         snapshotStore.Dispose();
         snapshotStore.Dispose();
     }
 }
Ejemplo n.º 15
0
            public TestContext ArrangeWithNoSnapshotting()
            {
                Sut = new SqlEventStore(new ConnectionFactory(_evtStoreConfig), _evtStoreConfig, new JsonSerializer());

                return(this);
            }
Ejemplo n.º 16
0
        public void ConfigureServices(IServiceCollection services)
        {
            try
            {
                services.AddCors();
                services.AddMvc();

                var sqlDb = new SqlDatabase(new EnvironmentVariable("HomeTaskManagementSqlConnection"));
                services.AddSingleton(new MiniAuth(new EnvironmentVariable("HomeTaskManagementSecret")));
                services.AddSingleton(new AppHealth(TimeSpan.FromMinutes(15), sqlDb));
                var eventStore = new SqlEventStore(sqlDb, "HomeTask.Events");
                var blobStore  = new SqlBlobStore(sqlDb, "HomeTask.Blobs");

                var messages = new Messages();
                var users    = new Users(new UsersTable(sqlDb));
                services.AddSingleton(users);
                var tasks    = new Tasks(new TasksTable(sqlDb));
                var accounts = new Accounts(eventStore);
                services.AddSingleton(accounts);
                var pledges       = new Pledges(eventStore, users, accounts, new PledgeFundingSettings());
                var assignments   = new TaskAssignments(eventStore, tasks, users, new AssignmentSettings());
                var taskInstances = new TaskInstances(new InMemoryTaskInstanceStore(), assignments, messages);
                var treasury      = new Treasury(blobStore, accounts);

                services.AddSingleton(users);

                services.AddSingleton(new AppCommands(new Dictionary <string, IRequest>(StringComparer.InvariantCultureIgnoreCase)
                {
                    { nameof(OpenAccount), new AdminOnly(new JsonRequest <OpenAccount>(x => accounts.Apply(x))) },
                    { nameof(SetOverdraftPolicy), new AdminOnly(new JsonRequest <SetOverdraftPolicy>(x => accounts.Apply(x))) },
                    { nameof(TransactionRequest), new AdminOnly(new JsonRequest <TransactionRequest>(x => accounts.Apply(x))) },

                    { nameof(RegisterUser), new JsonRequest <RegisterUser>(x => users.Apply(x)) },
                    { nameof(UnregisterUser), new JsonRequest <UnregisterUser>(x => users.Apply(x)) },
                    { nameof(AddRoles), new AdminOnly(new JsonRequest <AddRoles>(x => users.Apply(x))) },
                    { nameof(RemoveRoles), new AdminOnly(new JsonRequest <RemoveRoles>(x => users.Apply(x))) },

                    { nameof(AssignTask), new AdminOnly(new JsonRequest <AssignTask>(x => assignments.Apply(x))) },

                    { nameof(CreateTask), new AdminOnly(new JsonRequest <CreateTask>(x => tasks.Apply(x))) },
                    { nameof(DeleteTask), new AdminOnly(new JsonRequest <DeleteTask>(x => tasks.Apply(x))) },

                    { nameof(SetPledge), new AdminOnly(new JsonRequest <SetPledge>(x => pledges.Apply(x))) },
                    { nameof(FundPledges), new ServiceOrAdmin(new JsonRequest <FundPledges>(x => pledges.Apply(x))) },

                    { nameof(MarkTaskComplete), new ApproverOnly(new JsonRequest <MarkTaskComplete>(x => taskInstances.Apply(x))) },
                    { nameof(MarkTaskNotComplete), new JsonRequest <MarkTaskNotComplete>(x => taskInstances.Apply(x)) },
                    { nameof(MarkTaskFunded), new ServiceOrAdmin(new JsonRequest <MarkTaskFunded>(x => taskInstances.Apply(x))) },
                    { nameof(ScheduleWorkItemsThrough), new ServiceOrAdmin(new JsonRequest <ScheduleWorkItemsThrough>(x => taskInstances.Apply(x))) },
                    { nameof(WaiveTask), new AdminOnly(new JsonRequest <WaiveTask>(x => taskInstances.Apply(x))) },

                    { nameof(RecordExpenditure), new JsonRequest <RecordExpenditure>(x => treasury.Apply(x)) }
                }));

                services.AddSingleton(new AppQueries(new Dictionary <string, IRequest>(StringComparer.InvariantCultureIgnoreCase)
                {
                    { "accounts", new ParameterlessRequest(() => accounts.GetAll().Select(x => new AccountBalance {
                            Name = users.Get(x.Id).Name, Balance = x.Balance
                        })) },
                    { nameof(Account), new JsonRequest <GetById>(x => Response.Success(accounts.Get(x.Id))) }
                }));

                new AppRecurringTasks(
                    new FundPledgesDaily(pledges),
                    new MarkNotCompletedTasksDaily(taskInstances),
                    new ScheduleTasksDaily(taskInstances))
                .Start();

                new HandleTaskInstanceCompletionPayments(taskInstances, accounts, messages)
                .Start();

                new FundScheduledTasks(taskInstances, accounts, messages)
                .Start();
            }
            catch (Exception e)
            {
                Console.WriteLine($"Fatal error in Startup: {e.Message}");
                Debug.WriteLine($"Fatal error in Startup: {e.Message}");
                Environment.Exit(-1);
            }
        }
Ejemplo n.º 17
0
        private static async Task GetEnumerableStreamBenchmarkAsync(TimeSpan timeout)
        {
            using (var db = new SqlLocalDB())
            {
                var es = new SqlEventStore(db.ConnectionString);

                await es.Database.InitializeAsync();

                await es.WithBulkCopyAppend().AppendAsync(GetUncommittedSource(1000, 100000));

                var streamIdSet = es.GetEnumerable().Select(x => x.StreamId).Distinct().ToList();

                //

                var fs = new[] {
                    "default",
                    "unknown",
                };

                var xs = new[] {
                    new List <double>(),
                    new List <double>(),
                };

                for (int k = 0; k < 10; k++)
                {
                    var i = 0;
                    foreach (var f in new Func <ISqlEventStore, ISqlEventStore>[] {
                        x => x,
                    })
                    {
                        var y = f(es);

                        var sw = new Stopwatch();

                        var rnd = Randomness.Create();

                        int n = 0;
                        while (sw.Elapsed < timeout)
                        {
                            var streamId = streamIdSet[rnd.Next(streamIdSet.Count)];

                            var minSeq = 1;
                            var maxSeq = minSeq + rnd.Next(100);

                            sw.Start();

                            n += y.GetEnumerableStream(streamId, minSeq, maxSeq).Count();

                            sw.Stop();
                        }

                        var p = n / sw.Elapsed.TotalSeconds;
                        xs[i].Add(p);
                        i++;
                    }

                    Console.Write($"{k}");

                    for (int j = 0; j < 2; j++)
                    {
                        var p = xs[j][k];

                        var fit = Tuple.Create(0d, 0d);

                        if (xs[j].Count > 1)
                        {
                            fit = Fit.Line(Enumerable.Range(1, xs[j].Count).Select(x => (double)x).ToArray(), xs[j].ToArray());
                        }

                        Console.Write($" | {fs[j]}: {p,9:N1} op/s {fit.Item1,9:N1}+x*{fit.Item2,9:N1}");
                    }
                    Console.WriteLine();
                }
            }
        }