Example #1
0
        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);
        }
Example #2
0
        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();
        }
Example #3
0
        private static ThreadedConsumer <OrderReadyForPayment> PrepareThreadedCashier(Cashier cashier)
        {
            var threadedCashier = new ThreadedConsumer <OrderReadyForPayment>("Cashier", cashier);

            MonitoredConsumers.Add(threadedCashier);
            StartableThings.Add(threadedCashier);
            return(threadedCashier);
        }