public void Dulicate_message_is_detected()
        {
            var builder = new CqrsEngineBuilder();
            builder.Memory(m =>
                {
                    m.AddMemorySender("in", s => s.IdGenerator(() => "same"));
                    m.AddMemoryRouter("in", c => "memory:null");
                });
            var observer = new ImmediateEventsObserver();
            builder.Advanced.RegisterObserver(observer);

            using (var token = new CancellationTokenSource())
            using (var build = builder.Build())
            {
                var sender = build.Resolve<IMessageSender>();
                sender.SendOne(new Message());
                sender.SendOne(new Message());

                observer.Event += @event =>
                    {
                        var e = @event as EnvelopeDuplicateDiscarded;

                        if (e != null)
                        {
                            token.Cancel();
                        }
                    };
                build.Start(token.Token);
                token.Token.WaitHandle.WaitOne(10000);
                Assert.IsTrue(token.IsCancellationRequested);
            }
        }
        public void Dulicate_message_is_detected()
        {
            var builder = new CqrsEngineBuilder();

            builder.Memory(m =>
            {
                m.AddMemorySender("in", s => s.IdGenerator(() => "same"));
                m.AddMemoryRouter("in", c => "memory:null");
            });
            var observer = new ImmediateEventsObserver();

            builder.Advanced.RegisterObserver(observer);

            using (var token = new CancellationTokenSource())
                using (var build = builder.Build())
                {
                    var sender = build.Resolve <IMessageSender>();
                    sender.SendOne(new Message());
                    sender.SendOne(new Message());

                    observer.Event += @event =>
                    {
                        var e = @event as EnvelopeDuplicateDiscarded;

                        if (e != null)
                        {
                            token.Cancel();
                        }
                    };
                    build.Start(token.Token);
                    token.Token.WaitHandle.WaitOne(10000);
                    Assert.IsTrue(token.IsCancellationRequested);
                }
        }
Ejemplo n.º 3
0
        public void Run_in_test()
        {
            var streamer = EnvelopeStreamer.CreateDefault(typeof(CreateCustomer), typeof(CustomerCreated));

            var builder = new CqrsEngineBuilder(streamer);
            var account = new MemoryAccount();

            var nuclear = account.CreateNuclear();
            var inbox   = account.CreateInbox("input");
            var sender  = account.CreateSimpleSender(streamer, "input");

            var handler = new MessageHandler();

            handler.WireToLambda <CreateCustomer>(customer => Consume(customer, nuclear, sender));
            handler.WireToLambda <CustomerCreated>(m => Console.WriteLine("Created!"));
            builder.Handle(inbox, handler.HandleEnvelope);

            using (var engine = builder.Build())
            {
                sender.SendOne(new CreateCustomer
                {
                    CustomerId   = 1,
                    CustomerName = "Rinat Abdullin"
                });
                engine.RunForever();
            }
        }
        public void Dulicate_message_is_detected()
        {
            var streamer = EnvelopeStreamer.CreateDefault(typeof(Message));

            var builder = new CqrsEngineBuilder(streamer);

            var cfg = new MemoryStorageConfig();

            var sender = cfg.CreateSimpleSender(streamer, "in");

            builder.Handle(cfg.CreateInbox("in"), envelope => Console.WriteLine("Got message"));

            var env = new EnvelopeBuilder("fixed ID").Build();

            using (var token = new CancellationTokenSource())
                using (var build = builder.Build())
                    using (TestObserver.When <EnvelopeDuplicateDiscarded>(discarded => token.Cancel()))
                    {
                        sender.SendBatch(new object[] { new Message() }, IdGeneration.HashContent);
                        sender.SendBatch(new object[] { new Message() }, IdGeneration.HashContent);
                        build.Start(token.Token);

                        if (Debugger.IsAttached)
                        {
                            token.Token.WaitHandle.WaitOne();
                        }
                        else
                        {
                            token.Token.WaitHandle.WaitOne(10000);
                        }

                        Assert.IsTrue(token.IsCancellationRequested);
                    }
        }
Ejemplo n.º 5
0
        public void Test()
        {
            // this test will start a simple web server on port 8082 (with a CQRS engine)
            // You might need to reserve that port or run test as admin. Check out unit test
            // output for the exact command line on port reservation (or MSDN docs)
            //
            // netsh http add urlacl url=http://+:8082/ user=RINAT-R5\Rinat.Abdullin
            // after starting the test, navigate you browser to localhost:8082/index.htm
            // and try dragging the image around



            // in-memory structure to capture mouse movement
            // statistics
            var stats = new MouseStats();


            // we accept a message just of this type, using a serializer
            var messages   = new[] { typeof(MouseMoved), typeof(MouseClick) };
            var serializer = new MyJsonSerializer(messages);
            var streamer   = new EnvelopeStreamer(serializer);
            var store      = new MemoryAccount();
            var atomic     = store.CreateNuclear().Factory;

            // let's configure our custom Http server to
            // 1. serve resources
            // 2. serve MouseStats View
            // 3. accept commands
            var environment = new HttpEnvironment {
                Port = 8082
            };
            var builder = new CqrsEngineBuilder(streamer);

            builder.AddProcess(new Listener(environment,
                                            new EmbeddedResourceHttpRequestHandler(typeof(MouseMoved).Assembly, "Snippets.HttpEndpoint"),
                                            new MouseStatsRequestHandler(stats),
                                            new HeatMapRequestHandler(atomic.GetEntityReader <unit, HeatMapView>()),
                                            new MouseEventsRequestHandler(store.CreateQueueWriter("inbox"), serializer, streamer)));

            builder.Handle(store.CreateInbox("inbox"), envelope =>
            {
                if (envelope.Items.Any(i => i.Content is MouseMoved))
                {
                    MouseStatHandler(envelope, stats);
                }
                else if (envelope.Items.Any(i => i.Content is MouseClick))
                {
                    MouseClickHandler(envelope, atomic.GetEntityWriter <unit, PointsView>());
                }
            });


            builder.AddProcess(new HeatMapGenerateTask(atomic.GetEntityReader <unit, PointsView>(), atomic.GetEntityWriter <unit, HeatMapView>()));



            Process.Start("http://localhost:8082/index.htm");
            // this is a test, so let's block everything
            builder.Build().RunForever();
        }
Ejemplo n.º 6
0
        public void Run_in_test()
        {
            var streamer = EnvelopeStreamer.CreateDefault(typeof(CreateCustomer), typeof(CustomerCreated));

            var builder = new CqrsEngineBuilder(streamer);
            var account = new MemoryStorageConfig();

            var nuclear = account.CreateNuclear(new TestStrategy());
            var inbox   = account.CreateInbox("input");
            var sender  = account.CreateSimpleSender(streamer, "input");



            var handler = new RedirectToCommand();

            handler.WireToLambda <CreateCustomer>(customer => Consume(customer, nuclear, sender));
            handler.WireToLambda <CustomerCreated>(m => Console.WriteLine("Created!"));
            builder.Handle(inbox, envelope => handler.InvokeMany(envelope.SelectContents()));

            using (var engine = builder.Build())
            {
                sender.SendOne(new CreateCustomer
                {
                    CustomerId   = 1,
                    CustomerName = "Rinat Abdullin"
                });
                engine.RunForever();
            }
        }
Ejemplo n.º 7
0
        public void Test()
        {
            using (var source = new CancellationTokenSource())
            {
                var dev = AzureStorage.CreateConfigurationForDev();
                WipeAzureAccount.Fast(s => s.StartsWith("test-"), dev);
                var b = new CqrsEngineBuilder(null);
                b.Dispatch(dev.CreateInbox("test-publish"), bytes =>
                {
                    if (bytes[0] == 42)
                    {
                        source.Cancel();
                    }
                });


                using (var engine = b.Build())
                {
                    var task = engine.Start(source.Token);

                    dev.CreateQueueWriter("test-publish").PutMessage(new byte[] { 42 });
                    if (!task.Wait(5000))
                    {
                        source.Cancel();
                    }
                }
            }
        }
        // ReSharper disable InconsistentNaming
        static void TestConfiguration(IQueueWriter sender, CqrsEngineBuilder builder)
        {
            int i = 0;

            using (var t = new CancellationTokenSource())
                using (TestObserver.When <MessageAcked>(ea =>
                {
                    if (ea.Context.QueueName != "do")
                    {
                        return;
                    }
                    if (i++ >= 5)
                    {
                        t.Cancel();
                    }
                }))
                    using (var engine = builder.Build())
                    {
                        engine.Start(t.Token);
                        sender.PutMessage(new byte[1]);
                        if (!t.Token.WaitHandle.WaitOne(5000))
                        {
                            t.Cancel();
                        }
                        Assert.IsTrue(t.IsCancellationRequested);
                    }
        }
Ejemplo n.º 9
0
        public void Test()
        {
            var dev = AzureStorage.CreateConfigurationForDev();

            WipeAzureAccount.Fast(s => s.StartsWith("test-"), dev);

            var events = new Subject <ISystemEvent>();
            var b      = new CqrsEngineBuilder();

            b.Azure(c => c.AddAzureProcess(dev, "test-publish"));
            b.Advanced.RegisterObserver(events);
            var engine = b.Build();
            var source = new CancellationTokenSource();

            engine.Start(source.Token);



            var builder = new CqrsClientBuilder();

            builder.Azure(c => c.AddAzureSender(dev, "test-publish"));
            var client = builder.Build();


            client.Sender.SendOne(new Message());

            using (engine)
                using (events.OfType <EnvelopeAcked>().Subscribe(e => source.Cancel()))
                {
                    source.Token.WaitHandle.WaitOne(5000);
                    source.Cancel();
                }
        }
Ejemplo n.º 10
0
        public void Test()
        {
            var streamer = EnvelopeStreamer.CreateDefault(typeof(SecondPassed));
            var builder  = new CqrsEngineBuilder(streamer);
            var store    = FileStorage.CreateConfig(GetType().Name, reset: true);


            builder.Handle(store.CreateInbox("inbox"), BuildRouter(store, streamer));
            builder.Handle(store.CreateInbox("process"), ie => Console.WriteLine("Message from past!"));

            var inboxWriter     = store.CreateQueueWriter("inbox");
            var futureContainer = store.CreateStreaming().GetContainer("future");
            var timer           = new StreamingTimerService(inboxWriter, futureContainer, streamer);

            builder.AddProcess(timer);
            builder.Handle(store.CreateInbox("timer"), timer.PutMessage);

            using (var engine = builder.Build())
            {
                var bytes = streamer.SaveEnvelopeData(new SecondPassed(), c => c.DelayBy(TimeSpan.FromSeconds(4)));
                inboxWriter.PutMessage(bytes);
                Console.WriteLine("Sent message to future...");
                engine.RunForever();
            }
        }
        static void TestConfiguration(Action <CqrsEngineBuilder> build, int useMessages)
        {
            var builder = new CqrsEngineBuilder();

            build(builder);


            var subj = new Subject <ISystemEvent>();

            builder.Advanced.Observers.Clear();
            builder.Advanced.RegisterObserver(subj);

            var step  = (useMessages / 5);
            int count = 0;
            var watch = new Stopwatch();

            using (var token = new CancellationTokenSource())
            {
                subj
                .OfType <EnvelopeAcked>()
                .Subscribe(ea =>
                {
                    count += 1;

                    if ((count % step) == 0)
                    {
                        var messagesPerSecond = count / watch.Elapsed.TotalSeconds;
                        Console.WriteLine("{0} - {1}", count, Math.Round(messagesPerSecond, 1));
                    }


                    if (ea.Attributes.Any(ia => ia.Key == "last"))
                    {
                        token.Cancel();
                    }
                });

                using (var engine = builder.Build())
                {
                    // first we send X then we check
                    var sender = engine.Resolve <IMessageSender>();

                    for (int i = 0; i < useMessages; i++)
                    {
                        sender.SendOne(new UsualMessage {
                            HasData = true
                        });
                    }
                    sender.SendOne(new UsualMessage {
                        HasData = true
                    }, b => b.AddString("last"));


                    watch.Start();
                    engine.Start(token.Token);
                    token.Token.WaitHandle.WaitOne(10000);
                }
            }
        }
Ejemplo n.º 12
0
        public void Test()
        {
            var types = Assembly.GetExecutingAssembly().GetExportedTypes()
                        .Where(t => typeof(IPS_SampleMessage).IsAssignableFrom(t));
            var streamer = EnvelopeStreamer.CreateDefault(types);
            var builder  = new CqrsEngineBuilder(streamer);
            // only message contracts within this class

            // configure in memory:
            //                            -> sub 1
            //  inbox -> [PubSubRouter] <
            //                            -> sub 2
            //
            var store   = new MemoryAccount();
            var nuclear = store.CreateNuclear();

            var router = new PubSubRouter(nuclear, store.CreateWriteQueueFactory(), streamer);

            router.Init();

            builder.Dispatch(store.CreateInbox("sub1"), b => Console.WriteLine("sub1 hit"));
            builder.Dispatch(store.CreateInbox("sub2"), b => Console.WriteLine("sub2 hit"));
            builder.Handle(store.CreateInbox("inbox"), router.DispatchMessage);


            var sender = store.CreateSimpleSender(streamer, "inbox");

            using (var engine = builder.Build())
                using (var cts = new CancellationTokenSource())
                {
                    var task = engine.Start(cts.Token);

                    // no handler should get these.
                    sender.SendOne(new SomethingHappened());
                    sender.SendOne(new OtherHappened());

                    // subscribe sub1 to all messages and sub2 to specific message
                    sender.SendControl(eb =>
                    {
                        eb.AddString("router-subscribe:sub1", ".*");
                        eb.AddString("router-subscribe:sub2", "SomethingHappened");
                    });
                    sender.SendOne(new SomethingHappened());
                    sender.SendOne(new OtherHappened());

                    // unsubscribe all
                    sender.SendControl(eb =>
                    {
                        eb.AddString("router-unsubscribe:sub1", ".*");
                        eb.AddString("router-unsubscribe:sub2", "SomethingHappened");
                    });
                    sender.SendOne(new SomethingHappened());
                    sender.SendOne(new OtherHappened());


                    task.Wait(5000);
                }
        }
Ejemplo n.º 13
0
        public void when_build()
        {
            var builder           = new CqrsEngineBuilder(null);
            var testEngineProcess = new TestEngineProcess();

            builder.AddTask(testEngineProcess);
            builder.Build(new CancellationToken());

            Assert.IsTrue(testEngineProcess.IsInitialized);
        }
Ejemplo n.º 14
0
        protected override CqrsEngineHost BuildHost()
        {
            var builder = new CqrsEngineBuilder();

            //NOTE: Core Lokad CQRS Initialization
            builder.UseProtoBufSerialization();

            builder.Domain(config =>
            {
                config.InAssemblyOf <CreateMessage>();
                config.InAssemblyOf <CreateMessageHandler>();
                config.ContextFactory(MyMessageContext.Factory);
            });

            var storageConfig = CreateCloudStorageConfig();

            builder.Azure(config =>
            {
                config.AddAzureProcess(storageConfig, Queues.MESSAGES);
                config.AddAzureSender(storageConfig, Queues.MESSAGES);
            });

            builder.Storage(config => config.AtomicIsInAzure(storageConfig, s =>
            {
                s.WithAssemblyOf <MessageView>();
                s.CustomStaticSerializer(new AtomicStorageSerializerWithProtoBuf());
            }));

            //NOTE: Event Store Initialization
            builder.ConfigureJonathanOliverEventStore(config =>
            {
                var connectionString = AzureSettingsProvider.GetString("EventStoreConnectionString");

                config.ConnectionString(connectionString);
                config.Hooks(p => p.Add <MyNullPipelineHook>());
                config.Snapshots(s =>
                {
                    //snapshotting isn't implemented correctly right now.
                    s.Disable();
                    s.CheckEvery(TimeSpan.FromSeconds(30));
                    //set this to something reasonable like 250.
                    //It's so low here to demonstrate background "out-of-band" snapshotting.
                    s.MaxThreshold(2);
                });
            });

            return(builder.Build());
        }
Ejemplo n.º 15
0
        public void Test()
        {
            var builder = new CqrsEngineBuilder();

            builder.Domain(mdm =>
            {
                mdm.HandlerSample <IConsume <object> >(c => c.Consume(null));
                mdm.WhereMessages(t => typeof(IBaseMessage1).IsAssignableFrom(t) || typeof(IBaseMessage2).IsAssignableFrom(t));
                mdm.InAssemblyOf(this);
            });

            builder.Memory(m =>
            {
                m.AddMemoryProcess("in");
                m.AddMemorySender("in");
            });

            var subj = new Subject <ISystemEvent>();

            builder.Advanced.Observers.Clear();
            builder.Advanced.Observers.Add(subj);



            using (var engine = builder.Build())
                using (var source = new CancellationTokenSource())
                {
                    int counter = 0;
                    subj.Where(t => t is EnvelopeAcked).Subscribe(e =>
                    {
                        if (++counter == 2)
                        {
                            source.Cancel();
                        }
                    });

                    engine.Start(source.Token);
                    var sender = engine.Resolve <IMessageSender>();
                    sender.SendOne(new Message1());
                    sender.SendOne(new Message2());

                    if (!source.Token.WaitHandle.WaitOne(3000))
                    {
                        Assert.Fail("This should've been canceled by now");
                    }
                }
        }
        public void Memory_lambda()
        {
            var config = new MemoryStorageConfig();
            var writer = config.CreateQueueWriter("test");
            var inbox  = config.CreateInbox("test");

            var builder = new CqrsEngineBuilder(null);

            builder.Dispatch(inbox, bytes => { });

            var setup = new Setup
            {
                Send   = i => writer.PutMessage(new[] { i }),
                Engine = builder.Build()
            };

            TestConfiguration(setup, 1000000);
        }
Ejemplo n.º 17
0
        // ReSharper disable InconsistentNaming


        static CqrsEngineHost BuildHost()
        {
            var builder = new CqrsEngineBuilder();

            builder.Azure(x => x.AddAzureProcess(AzureStorage.CreateConfigurationForDev(), "process-vip"));
            builder.Memory(x =>
            {
                x.AddMemoryProcess("process-all");
                x.AddMemoryRouter("inbox", e =>
                {
                    var isVip = e.Items.Any(i => i.MappedType == typeof(VipMessage));
                    return(isVip ? "azure-dev:process-vip" : "memory:process-all");
                });
                x.AddMemorySender("inbox", cm => cm.IdGeneratorForTests());
            });


            return(builder.Build());
        }
Ejemplo n.º 18
0
        public void Then_transactional_support_is_provided()
        {
            var streamer = EnvelopeStreamer.CreateDefault(typeof(Act));
            var builder  = new CqrsEngineBuilder(streamer);
            var setup    = ComposeComponents(streamer);

            var handler = new CommandHandler();

            handler.WireToLambda <Act>(act => Consume(act, setup.Storage));
            builder.Handle(setup.Inbox, envelope =>
            {
                using (var tx = new TransactionScope(TransactionScopeOption.RequiresNew))
                {
                    handler.HandleAll(envelope);
                    tx.Complete();
                }
            });


            using (var source = new CancellationTokenSource())
                using (TestObserver.When <EnvelopeDispatched>(e => source.Cancel()))
                    using (var engine = builder.Build())
                    {
                        setup.Sender.SendBatch(new[] { new Act(), new Act(), new Act {
                                                           Fail = true
                                                       } });
                        setup.Sender.SendBatch(new[] { new Act(), new Act(), new Act() });


                        var task = engine.Start(source.Token);
                        //    Trace.WriteLine("Started");
                        if (!task.Wait(Debugger.IsAttached ? int.MaxValue : TestSpeed))
                        {
                            source.Cancel();
                            Assert.Fail("System should be stopped by now");
                        }

                        var storage = setup.Storage;
                        var count   = storage.GetSingletonOrNew <int>();
                        Assert.AreEqual(3, count, "Three acts are expected");
                    }
        }
        public void File_lambda()
        {
            var config = FileStorage.CreateConfig("throughput-tests");

            config.Wipe();

            var writer  = config.CreateQueueWriter("test");
            var inbox   = config.CreateInbox("test", u => TimeSpan.FromMilliseconds(0));
            var builder = new CqrsEngineBuilder(null);

            builder.Dispatch(inbox, bytes => { });

            var setup = new Setup
            {
                Send   = i => writer.PutMessage(new[] { i }),
                Engine = builder.Build()
            };

            TestConfiguration(setup, 1000);
        }
        public void Throughput_Azure_lambda()
        {
            var config = AzureStorage.CreateConfigurationForDev();

            WipeAzureAccount.Fast(s => s.StartsWith("throughput"), config);

            var writer  = config.CreateQueueWriter("test");
            var inbox   = config.CreateInbox("test", u => TimeSpan.Zero);
            var builder = new CqrsEngineBuilder(null);

            builder.Dispatch(inbox, bytes => { });

            var setup = new Setup
            {
                Send   = i => writer.PutMessage(new[] { i }),
                Engine = builder.Build()
            };

            TestConfiguration(setup, 100);
        }
        public void Run_in_test()
        {
            var builder = new CqrsEngineBuilder();

            builder.Memory(m =>
            {
                m.AddMemorySender("work");
                m.AddMemoryProcess("work");
            });
            builder.Storage(m => m.AtomicIsInMemory());

            using (var engine = builder.Build())
            {
                //engine.Resolve<IMessageSender>().SendOne(new CreateCustomer()
                //{
                //    CustomerId = 1,
                //    CustomerName = "Rinat Abdullin"
                //});
                engine.RunForever();
            }
        }
        static void TestConfiguration(Action <CqrsEngineBuilder> build)
        {
            var builder = new CqrsEngineBuilder();

            builder.UseProtoBufSerialization();
            build(builder);


            var subj = new Subject <ISystemEvent>();

            builder.Advanced.Observers.Clear();
            builder.Advanced.RegisterObserver(subj);
            int count = 0;

            subj
            .OfType <EnvelopeAcked>()
            .Subscribe(acked => count += 1);

            var watch = new Stopwatch();

            using (var token = new CancellationTokenSource())
                using (var engine = builder.Build())
                {
                    engine.Start(token.Token);

                    engine
                    .Resolve <IMessageSender>()
                    .SendOne(new UsualMessage());

                    watch.Start();
                    token.Token.WaitHandle.WaitOne(5000);
                }

            watch.Stop();
            var messagesPerSecond = count / watch.Elapsed.TotalSeconds;
            var round             = Math.Round(messagesPerSecond, 1);

            Console.WriteLine("{0} messages per second", round);
        }
Ejemplo n.º 23
0
        public void Test()
        {
            var builder = new CqrsEngineBuilder();

            builder.Domain(m =>
            {
                m.HandlerSample <Definitions.Define.Consumer <Definitions.Define.ICommand> >(c => c.Consume(null));
                m.ContextFactory((e, x) => new Definitions.Define.MyContext(e.GetAttribute("EntityId", "")));
            });
            builder.Storage(m => m.AtomicIsInMemory());
            builder.Memory(m =>
            {
                m.AddMemorySender("in", c => c.IdGeneratorForTests());
                m.AddMemoryProcess("in");
            });

            builder.Advanced.ConfigureContainer(cb =>
            {
                cb.Register(c => new InMemoryEventStreamer <IAccountEvent>(c.Resolve <IMessageSender>())).
                SingleInstance();

                cb.RegisterType <InMemoryEventStreamer <IAccountEvent> >().SingleInstance();
                cb.RegisterType <AccountAggregateRepository>().SingleInstance();
            });

            using (var source = new CancellationTokenSource())
                using (var engine = builder.Build())
                {
                    engine.Start(source.Token);

                    var sender = engine.Resolve <IMessageSender>();
                    sender.SendOne(new CreateAccount("Sample User"), cb => cb.AddString("EntityId", "1"));
                    sender.SendOne(new AddLogin("login", "pass"), cb => cb.AddString("EntityId", "1"));

                    source.Token.WaitHandle.WaitOne(5000);
                    source.Cancel();
                }
        }
        static void TestConfiguration(Action <CqrsEngineBuilder> config)
        {
            var events  = new Subject <ISystemEvent>(Scheduler.TaskPool);
            var builder = new CqrsEngineBuilder();

            builder.Advanced.RegisterObserver(events);

            config(builder);

            using (var engine = builder.Build())
                using (var t = new CancellationTokenSource())
                    using (events
                           .OfType <EnvelopeAcked>()
                           .Where(ea => ea.QueueName == "do")
                           .Skip(5)
                           .Subscribe(c => t.Cancel()))
                    {
                        engine.Start(t.Token);
                        engine.Resolve <IMessageSender>().SendOne(new Message1(0));
                        t.Token.WaitHandle.WaitOne(5000);

                        Assert.IsTrue(t.IsCancellationRequested);
                    }
        }
Ejemplo n.º 25
0
 public CqrsEngineHost BuildEngine(CancellationToken token)
 {
     return(Builder.Build(token));
 }
Ejemplo n.º 26
0
        protected override CqrsEngineHost BuildHost()
        {
            var builder = new CqrsEngineBuilder();

            //NOTE: Core Lokad CQRS Initialization
            builder.UseProtoBufSerialization();

            builder.Domain(config =>
            {
                config.InAssemblyOf<CreateMessage>();
                config.InAssemblyOf<CreateMessageHandler>();
                config.ContextFactory(MyMessageContext.Factory);
            });

            var storageConfig = CreateCloudStorageConfig();

            builder.Azure(config =>
            {

                config.AddAzureProcess(storageConfig, Queues.MESSAGES);
                config.AddAzureSender(storageConfig, Queues.MESSAGES);
            });

            builder.Storage(config => config.AtomicIsInAzure(storageConfig, s =>
            {
                s.WithAssemblyOf<MessageView>();
                s.CustomStaticSerializer(new AtomicStorageSerializerWithProtoBuf());
            }));

            //NOTE: Event Store Initialization
            builder.ConfigureJonathanOliverEventStore(config =>
            {
                var connectionString = AzureSettingsProvider.GetString("EventStoreConnectionString");

                config.ConnectionString(connectionString);
                config.Hooks(p => p.Add<MyNullPipelineHook>());
                config.Snapshots(s =>
                {
                    //snapshotting isn't implemented correctly right now.
                    s.Disable();
                    s.CheckEvery(TimeSpan.FromSeconds(30));
                    //set this to something reasonable like 250.
                    //It's so low here to demonstrate background "out-of-band" snapshotting.
                    s.MaxThreshold(2);
                });
            });

            return builder.Build();
        }
Ejemplo n.º 27
0
        public void TestConfiguration(params Action <CqrsEngineBuilder>[] config)
        {
            var events  = new Subject <ISystemEvent>(Scheduler.TaskPool);
            var builder = new CqrsEngineBuilder();

            builder.Advanced.RegisterObserver(events);

            Configure(builder);
            foreach (var action in config)
            {
                action(builder);
            }

            var disposables = new List <IDisposable>();

            try
            {
                using (var engine = builder.Build())
                    using (var t = new CancellationTokenSource())
                    {
                        var sender = engine.Resolve <IMessageSender>();
                        foreach (var subscription in _subscriptions)
                        {
                            disposables.Add(subscription(events, sender, t));
                        }


                        engine.Start(t.Token);
                        foreach (var message in _messages)
                        {
                            message(sender);
                        }

                        if (Debugger.IsAttached)
                        {
                            t.Token.WaitHandle.WaitOne();
                        }
                        else
                        {
                            t.Token.WaitHandle.WaitOne(5000);
                        }


                        if (_failures.Any())
                        {
                            Assert.Fail(_failures.First());
                        }

                        if (!t.IsCancellationRequested)
                        {
                            Assert.Fail("Engine should be stopped manually!");
                        }

                        foreach (var assert in _asserts)
                        {
                            assert(engine);
                        }
                    }
            }
            finally
            {
                foreach (var disposable in disposables)
                {
                    disposable.Dispose();
                }
            }
        }
Ejemplo n.º 28
0
        static void Main(string[] args)
        {
            const string integrationPath = @"temp";

            ConfigureObserver();

            var config = FileStorage.CreateConfig(integrationPath, "files");

            var demoMessages   = new List <ISampleMessage>();
            var currentProcess = Process.GetCurrentProcess();

            demoMessages.Add(new InstanceStarted("Inject git rev", currentProcess.ProcessName,
                                                 currentProcess.Id.ToString()));


            {
                // wipe all folders
                config.Reset();
                Console.WriteLine("Starting in funny mode");
                var security = new SecurityId(0);
                demoMessages.Add(new CreateSecurityAggregate(security));
                demoMessages.Add(new AddSecurityPassword(security, "Rinat Abdullin", "*****@*****.**", "password"));
                demoMessages.Add(new AddSecurityIdentity(security, "Rinat's Open ID", "http://abdullin.myopenid.org"));
                demoMessages.Add(new AddSecurityKey(security, "some key"));
            }



            var atomic   = config.CreateNuclear(new DocumentStrategy());
            var identity = new IdentityGenerator(atomic);
            var streamer = Contracts.CreateStreamer();

            var tapes       = config.CreateTape(Topology.TapesContainer);
            var streaming   = config.CreateStreaming();
            var routerQueue = config.CreateQueueWriter(Topology.RouterQueue);
            var aggregates  = new AggregateFactory(tapes, streamer, routerQueue, atomic, identity);

            var sender = new SimpleMessageSender(streamer, routerQueue);
            var flow   = new MessageSender(sender);

            var builder = new CqrsEngineBuilder(streamer);


            builder.Handle(config.CreateInbox(Topology.RouterQueue),
                           Topology.Route(config.CreateQueueWriter, streamer, tapes), "router");
            builder.Handle(config.CreateInbox(Topology.EntityQueue), aggregates.Dispatch);

            var functions = new RedirectToDynamicEvent();
            // documents
            //functions.WireToWhen(new RegistrationUniquenessProjection(atomic.Factory.GetEntityWriter<unit, RegistrationUniquenessDocument>()));

            // UI projections
            var projectionStore = config.CreateNuclear(new ProjectionStrategy());

            foreach (var projection in BootstrapProjections.BuildProjectionsWithWhenConvention(projectionStore.Factory))
            {
                functions.WireToWhen(projection);
            }

            // processes
            //functions.WireToWhen(new BillingProcess(flow));
            //functions.WireToWhen(new RegistrationProcess(flow));
            functions.WireToWhen(new ReplicationProcess(flow));

            builder.Handle(config.CreateInbox(Topology.EventsQueue), aem => CallHandlers(functions, aem));


            var timer = new StreamingTimerService(config.CreateQueueWriter(Topology.RouterQueue),
                                                  streaming.GetContainer(Topology.FutureMessagesContainer), streamer);

            builder.Handle(config.CreateInbox(Topology.TimerQueue), timer.PutMessage);
            builder.AddProcess(timer);


            using (var cts = new CancellationTokenSource())
                using (var engine = builder.Build())
                {
                    var task = engine.Start(cts.Token);

                    foreach (var sampleMessage in demoMessages)
                    {
                        sender.SendOne(sampleMessage);
                    }

                    Console.WriteLine(@"Press enter to stop");
                    Console.ReadLine();
                    cts.Cancel();



                    if (task.Wait(5000))
                    {
                        Console.WriteLine(@"Terminating");
                    }
                }
        }
Ejemplo n.º 29
0
        private static void StartProgram(CqrsEngineBuilder builder)
        {
            builder.Advanced.RegisterObserver(new LogFileObserver());

            builder.Advanced.ConfigureContainer(b => b.RegisterType<Program>()
                                                         .WithParameter(TypedParameter.From(tokenSource)));

            var engine = builder.Build();

            engine.Start(tokenSource.Token);

            engine.Resolve<Program>().Run();
        }