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); } }
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); } }
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(); }
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(); } }
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); } }
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(); } }
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); } } }
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); } }
public void when_build() { var builder = new CqrsEngineBuilder(null); var testEngineProcess = new TestEngineProcess(); builder.AddTask(testEngineProcess); builder.Build(new CancellationToken()); Assert.IsTrue(testEngineProcess.IsInitialized); }
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()); }
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); }
// 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()); }
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); }
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); } }
public CqrsEngineHost BuildEngine(CancellationToken token) { return(Builder.Build(token)); }
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(); }
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(); } } }
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"); } } }
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(); }