static void Main() { var bus = new TopicBasedPubSub(); var messageListener = new MessageListener(bus); var startables = new List <IStartable>(); var midgetFactory = new MidgetFactory(); var midgetHouse = new MidgetHouse(bus, midgetFactory); var consolePrinter = new QueuedHandler <OrderPaid>(Messages.Paid, new ConsolePrintingOrderHandler(bus)); bus.Subscribe(consolePrinter); startables.Add(consolePrinter); var cashier = new Cashier(bus); var queuedCashier = new QueuedHandler <TakePayment>(Messages.OrderBilled, cashier); bus.Subscribe(queuedCashier); startables.Add(queuedCashier); startables.Add(cashier); var assistantManager = new QueuedHandler <PriceOrder>(Messages.OrderPrepared, new AssistantManager(bus)); bus.Subscribe(assistantManager); startables.Add(assistantManager); var chefs = new List <QueuedHandler <CookFood> >(); var rand = new Random(); for (int i = 0; i < NumberOfChefs; i++) { var chef = new TimeToLiveDispatcher <CookFood>(new Chef(bus, rand.Next(1000))); var queuedHandler = new QueuedHandler <CookFood>(string.Format("Chef {0}", i), chef); chefs.Add(queuedHandler); startables.Add(queuedHandler); } var distributionStrategy = new QueuedDispatcher <CookFood>(bus, chefs); startables.Add(distributionStrategy); foreach (var startable in startables) { startable.Start(); } var monitor = new Monitor(startables); monitor.Start(); var waiter = new Waiter(bus); for (int i = 0; i < 10; i++) { var correlationId = Guid.NewGuid(); var orderId = waiter.PlaceOrder(correlationId); } Console.ReadKey(); }
static void Main() { var bus = new TopicBasedPubSub(); var messageListener = new MessageListener(bus); var startables = new List<IStartable>(); var midgetFactory = new MidgetFactory(); var midgetHouse = new MidgetHouse(bus, midgetFactory); var consolePrinter = new QueuedHandler<OrderPaid>(Messages.Paid, new ConsolePrintingOrderHandler(bus)); bus.Subscribe(consolePrinter); startables.Add(consolePrinter); var cashier = new Cashier(bus); var queuedCashier = new QueuedHandler<TakePayment>(Messages.OrderBilled, cashier); bus.Subscribe(queuedCashier); startables.Add(queuedCashier); startables.Add(cashier); var assistantManager = new QueuedHandler<PriceOrder>(Messages.OrderPrepared, new AssistantManager(bus)); bus.Subscribe(assistantManager); startables.Add(assistantManager); var chefs = new List<QueuedHandler<CookFood>>(); var rand = new Random(); for (int i = 0; i < NumberOfChefs; i++) { var chef = new TimeToLiveDispatcher<CookFood>(new Chef(bus, rand.Next(1000))); var queuedHandler = new QueuedHandler<CookFood>(string.Format("Chef {0}", i), chef); chefs.Add(queuedHandler); startables.Add(queuedHandler); } var distributionStrategy = new QueuedDispatcher<CookFood>(bus, chefs); startables.Add(distributionStrategy); foreach (var startable in startables) { startable.Start(); } var monitor = new Monitor(startables); monitor.Start(); var waiter = new Waiter(bus); for (int i = 0; i < 10; i++) { var correlationId = Guid.NewGuid(); var orderId = waiter.PlaceOrder(correlationId); } Console.ReadKey(); }
static void Main() { #warning TODO: Replace topics with message types??? #warning TODO: Make TimeToLiveHandler work with OrderMessageBase var waitress = new Waitress("Sexy Mary"); var kitchen = PrepareKitchen(); var assistantManager = PrepareAssistantManager(); var cashier = new Cashier(); var threadedCashier = PrepareThreadedCashier(cashier); var alarmClock = PrepareAlarmClock(); var midgetHouse = new MidgetHouse(); TopicPubSub.Instance.Subscribe <OrderPlaced>(Topics.NewOrders, midgetHouse); TopicPubSub.Instance.Subscribe(Topics.CooksQueue, kitchen); TopicPubSub.Instance.Subscribe(Topics.Pricing, assistantManager); TopicPubSub.Instance.Subscribe(Topics.Payment, threadedCashier); TopicPubSub.Instance.Subscribe <OrderCompleted>(Topics.CompletedOrders, midgetHouse); TopicPubSub.Instance.Subscribe(Topics.WakeUpCalls, alarmClock); Start(); const int numberOfOrders = 200; var startTimes = new Dictionary <string, DateTime>(); StartPlacingOrders(numberOfOrders, waitress, startTimes); var summary = PayOrders(cashier, startTimes, numberOfOrders); Thread.Sleep(1000); Console.WriteLine(summary.ToString()); Console.WriteLine("Press enter to finish..."); Console.ReadLine(); }
static void Main() { #warning TODO: Replace topics with message types??? #warning TODO: Make TimeToLiveHandler work with OrderMessageBase var waitress = new Waitress("Sexy Mary"); var kitchen = PrepareKitchen(); var assistantManager = PrepareAssistantManager(); var cashier = new Cashier(); var threadedCashier = PrepareThreadedCashier(cashier); var alarmClock = PrepareAlarmClock(); var midgetHouse = new MidgetHouse(); TopicPubSub.Instance.Subscribe<OrderPlaced>(Topics.NewOrders, midgetHouse); TopicPubSub.Instance.Subscribe(Topics.CooksQueue, kitchen); TopicPubSub.Instance.Subscribe(Topics.Pricing, assistantManager); TopicPubSub.Instance.Subscribe(Topics.Payment, threadedCashier); TopicPubSub.Instance.Subscribe<OrderCompleted>(Topics.CompletedOrders, midgetHouse); TopicPubSub.Instance.Subscribe(Topics.WakeUpCalls, alarmClock); Start(); const int numberOfOrders = 200; var startTimes = new Dictionary<string, DateTime>(); StartPlacingOrders(numberOfOrders, waitress, startTimes); var summary = PayOrders(cashier, startTimes, numberOfOrders); Thread.Sleep(1000); Console.WriteLine(summary.ToString()); Console.WriteLine("Press enter to finish..."); Console.ReadLine(); }
static void Main(string[] args) { var d = new Dispatcher(); var midgetHouse = new MidgetHouse(d); d.Subscribe<OrderPlaced>(midgetHouse); d.Subscribe<DodgyOrderPlaced>(midgetHouse); var manager = new Manager(); var cashier = new Cashier(d); var ass = new AssMan(d); var cookDispatcher = new SmartDispatcher<CookFood>(); var cookTtlGate = new TimeToLiveGate<CookFood>(cookDispatcher); var cookQueudHandler = new QueuedHandler<CookFood>(cookTtlGate, "cook ttl gate"); var cookLimiter = new Limiter<CookFood>(cookQueudHandler); //var cookScrewsUp = new ScrewsUp<CookFood>(cookLimiter); var alarmClock = new AlarmClock(d); var messageMonitor = new MessageMonitor(d); var fmm = new FilePerOrderMonitor(d); d.Subscribe(alarmClock); d.Subscribe(cookLimiter); d.Subscribe(ass); d.Subscribe(cashier); d.Subscribe(manager); d.Subscribe<OrderPlaced>(messageMonitor); d.Subscribe<DodgyOrderPlaced>(messageMonitor); d.Subscribe<OrderPlaced>(fmm); d.Subscribe<DodgyOrderPlaced>(fmm); var cookQueudHandler1 = new QueuedHandler<CookFood>(new Cook(d, 10000), "c1"); cookDispatcher.AddHandler(cookQueudHandler1); var cookQueudHandler2 = new QueuedHandler<CookFood>(new Cook(d, 5000), "c2"); cookDispatcher.AddHandler(cookQueudHandler2); var cookQueudHandler3 = new QueuedHandler<CookFood>(new Cook(d, 100), "c3"); cookDispatcher.AddHandler(cookQueudHandler3); var queueMonitor = new QueueMonitor(new IAmMonitored[] {cookQueudHandler1, cookQueudHandler2, cookQueudHandler3, cookQueudHandler,d.QueudHandler}); //Cook cook = new Cook(ass); var waiter = new Waiter(d); cookQueudHandler1.Start(); cookQueudHandler2.Start(); cookQueudHandler3.Start(); cookQueudHandler.Start(); d.Start(); alarmClock.Start(); queueMonitor.Start(); new Thread(TryPay).Start(cashier); Random r = new Random(); for (int i = 0; i < 500; i++) { Guid orderNumber; if (r.Next()%2 == 0) { orderNumber = waiter.PlaceDodgyOrder(new[] {Tuple.Create("Burger", 1)}, 15); } else { orderNumber = waiter.PlaceOrder(new[] { Tuple.Create("Burger", 1) }, 15); } if(i > 2)Thread.Sleep(2000); orders.TryAdd(orderNumber, null); } //var orderNumber = waiter.PlaceOrder(new[] {Tuple.Create("Burger", 1)}, 15); //cashier.PayForOrder(orderNumber); Console.ReadLine(); }
public ZimbabweMidget(string correlationId, MidgetHouse midgetHouse, IPublisher publisher) { CorrelationId = correlationId; _midgetHouse = midgetHouse; _publisher = publisher; }