private static StringBuilder PayOrders(Cashier cashier, Dictionary <string, DateTime> startTimes, int numberOfOrders) { var ordersPaid = 0; var buffer = new StringBuilder(); do { var ordersToPay = cashier.GetOrdersReadyToPay(); foreach (var order in ordersToPay) { cashier.PayBill(order); var startTime = startTimes[order.Id]; Logger.Info("Order paid. Time: {0} Id {1}", (DateTime.Now - startTime), order.Id); ordersPaid++; } } while (ordersPaid < numberOfOrders); return(buffer); }
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(); }
private static ThreadedConsumer <OrderReadyForPayment> PrepareThreadedCashier(Cashier cashier) { var threadedCashier = new ThreadedConsumer <OrderReadyForPayment>("Cashier", cashier); MonitoredConsumers.Add(threadedCashier); StartableThings.Add(threadedCashier); return(threadedCashier); }