static void AttachToLocalLog(string filePath) { SimpleMessageSender sender; var cache = new FileTapeStream(filePath); var store = new LocalEventStore(null, cache); var directoryName = Path.GetDirectoryName(filePath) ?? ""; var dir = new DirectoryInfo(directoryName); FileStorageConfig config; if (dir.Name == Topology.TapesContainer) { // we are in proper tapes container config = FileStorage.CreateConfig(dir.Parent); } else { var temp = Path.Combine(dir.FullName, string.Format("temp-{0:yyyy-MM-dd-HHmm}", DateTime.Now)); config = FileStorage.CreateConfig(temp); } var send = config.CreateQueueWriter(Topology.RouterQueue); var endpoint = new SimpleMessageSender(EnvelopeStreamer, send); Application.Run(new DomainLogView(store, endpoint, EnvelopeStreamer)); }
public DomainLogView(LocalEventStore eventStore, SimpleMessageSender endpoint, IEnvelopeStreamer serializer) { InitializeComponent(); _client = eventStore; _services = new ShellServices(endpoint); _serializer = serializer; _log.BackColor = CommonColors.Solarized.Base03; _log.ForeColor = CommonColors.Solarized.Base0; _display.BackColor = CommonColors.Solarized.Base3; _display.ForeColor = CommonColors.Solarized.Base00; _detailsLabel.BackColor = CommonColors.Solarized.Base2; _detailsLabel.ForeColor = CommonColors.Solarized.Base01; var control = new RepopulateView(serializer, eventStore, _services) { Dock = DockStyle.Fill }; viewsTab.Controls.Add(control); }
public AssembledComponents AssembleComponents() { var documents = CreateNuclear(new DocumentStrategy()); var streamer = Streamer; var tapes = Tapes; var streaming = Streaming; var routerQueue = CreateQueueWriter(Topology.RouterQueue); var aggregates = new AggregateFactory(tapes, streamer, routerQueue); var sender = new SimpleMessageSender(streamer, routerQueue); var flow = new MessageSender(sender); var builder = new CqrsEngineBuilder(streamer); var log = tapes.GetOrCreateStream(Topology.DomainLogName); var dispatcher = new SimpleDispatcher(aggregates, streamer, log); builder.Handle(CreateInbox(Topology.RouterQueue), Topology.Route(CreateQueueWriter, streamer, tapes), "router"); builder.Handle(CreateInbox(Topology.EntityQueue), aggregates.Dispatch); var functions = new RedirectToDynamicEvent(); // documents //functions.WireToWhen(new RegistrationUniquenessProjection(atomic.Factory.GetEntityWriter<unit, RegistrationUniquenessDocument>())); // UI projections var projectionStore = CreateNuclear(new ProjectionStrategy()); foreach (var projection in BootstrapProjections.BuildProjectionsWithWhenConvention(projectionStore.Factory)) { functions.WireToWhen(projection); } // processes //functions.WireToWhen(new Domain.RecipeProcess(flow)); builder.Handle(CreateInbox(Topology.EventsQueue), aem => CallHandlers(functions, aem)); var timer = new StreamingTimerService(CreateQueueWriter(Topology.RouterQueue), streaming.GetContainer(Topology.FutureMessagesContainer), streamer); builder.Handle(CreateInbox(Topology.TimerQueue), timer.PutMessage); builder.AddProcess(timer); // GNS: just for this simple sample. In reality one would have some command handlers involved Bus.SetBus(new SimpleBus(sender, dispatcher)); return(new AssembledComponents { Builder = builder, Sender = sender, Dispatcher = dispatcher, ProjectionFactory = projectionStore.Factory, Setup = this }); }
static void Consume(CreateCustomer cmd, NuclearStorage storage, SimpleMessageSender sender) { var customer = new Customer(cmd.CustomerId, cmd.CustomerName); storage.AddEntity(customer.Id, customer); sender.SendOne(new CustomerCreated { CustomerId = cmd.CustomerId, CustomerName = cmd.CustomerName }); }
protected static void HandleNuclear(NuclearMessage msg, SimpleMessageSender sender, NuclearStorage storage) { var count = storage.AddOrUpdateSingleton(() => 1, i => i + 1); if (count >= 2) { sender.SendBatch(new object[] {}, e => e.AddString("ok")); return; } sender.SendOne(new NuclearMessage()); }
protected static void HandleAtomic(AtomicMessage msg, SimpleMessageSender sender, IAtomicWriter <unit, int> arg3) { var count = arg3.AddOrUpdate(unit.it, () => 1, i => i + 1); if (count > 2) { sender.SendBatch(new object[] {}, e => e.AddString("ok")); return; } sender.SendOne(new AtomicMessage()); }
static void AttachToLocalLog(string filePath) { var config = FileStorage.CreateConfig(Path.GetDirectoryName(filePath) ?? ""); var cache = new FileTapeStream(filePath); var store = new LocalEventStore(null, cache); var send = config.CreateQueueWriter(Topology.RouterQueue); var endpoint = new SimpleMessageSender(EnvelopeStreamer, send); Application.Run(new DomainLogView(store, endpoint, EnvelopeStreamer)); }
public DomainLogView(LocalEventStore eventStore, SimpleMessageSender endpoint, IEnvelopeStreamer serializer) { InitializeComponent(); _client = eventStore; _services = new ShellServices(endpoint); _serializer = serializer; _log.BackColor = CommonColors.Solarized.Base03; _log.ForeColor = CommonColors.Solarized.Base0; _display.BackColor = CommonColors.Solarized.Base3; _display.ForeColor = CommonColors.Solarized.Base00; _detailsLabel.BackColor = CommonColors.Solarized.Base2; _detailsLabel.ForeColor = CommonColors.Solarized.Base01; }
public DomainLogView(LocalEventStore eventStore, SimpleMessageSender endpoint, IEnvelopeStreamer serializer) { InitializeComponent(); _client = eventStore; _services = new ShellServices(endpoint); _serializer = serializer; _log.BackColor = CommonColors.Solarized.Base03; _log.ForeColor = CommonColors.Solarized.Base0; _display.BackColor = CommonColors.Solarized.Base3; _display.ForeColor = CommonColors.Solarized.Base00; _detailsLabel.BackColor = CommonColors.Solarized.Base2; _detailsLabel.ForeColor = CommonColors.Solarized.Base01; var control = new RepopulateView(serializer, eventStore, _services) {Dock = DockStyle.Fill}; viewsTab.Controls.Add(control); }
public AssembledComponents AssembleComponents() { // set up all the variables var routerQueue = CreateQueueWriter(Topology.RouterQueue); var commands = new RedirectToCommand(); var events = new RedirectToDynamicEvent(); IEventStore eventStore = null;// new LegacyTapeStreamEventStore(Tapes(Topology.TapesContainer), Streamer, routerQueue); var simple = new SimpleMessageSender(Streamer, routerQueue); var flow = new CommandSender(simple); var builder = new CqrsEngineBuilder(Streamer); // route queue infrastructure together builder.Handle(CreateInbox(Topology.RouterQueue), Topology.Route(CreateQueueWriter, Streamer, Tapes), "router"); builder.Handle(CreateInbox(Topology.EntityQueue), em => CallHandlers(commands, em)); builder.Handle(CreateInbox(Topology.EventsQueue), aem => CallHandlers(events, aem)); // message wiring magic DomainBoundedContext.ApplicationServices(Docs, eventStore).ForEach(commands.WireToWhen); DomainBoundedContext.Receptors(flow).ForEach(events.WireToWhen); DomainBoundedContext.Projections(Docs).ForEach(events.WireToWhen); DomainBoundedContext.Tasks(flow, Docs, false).ForEach(builder.AddTask); ClientBoundedContext.Projections(Docs).ForEach(events.WireToWhen); return(new AssembledComponents { Builder = builder, Sender = flow, Setup = this, Simple = simple }); }
public CommandSender(SimpleMessageSender sender) { _sender = sender; }
public MessageSender(SimpleMessageSender sender) { _sender = sender; }
public ShellServices(SimpleMessageSender client) { _client = client; }
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"); } } }
public SimpleBus(SimpleMessageSender sender, SimpleDispatcher dispatcher) { _sender = sender; _dispatcher = dispatcher; }