Exemplo n.º 1
0
        private static MonitorableQueueThreadHandler <T> CreateQueueThreadHandler <T>(IOrderHandler <T> cashier) where T : MessageBase
        {
            var cashierThread = new MonitorableQueueThreadHandler <T>(cashier);

            _startables.Add(cashierThread);
            return(cashierThread);
        }
Exemplo n.º 2
0
        static void Main(string[] args)
        {
            _random     = new Random();
            _startables = new List <IStartable>();
            _publisher  = new TopicPublisher();

            var printerHandler = new PrinterHandler();

            var cashier = new Cashier(_publisher);

            var cashierQueue = CreateQueueThreadHandler(cashier);

            var asstManager = new AssistantManager(_publisher);

            var cookHandlers = CreateCooks();

            var dispatcher           = new BalancedRoundRobin <OrderPlaced>(cookHandlers);
            var cooksDispatcherQueue = new MonitorableQueueThreadHandler <OrderPlaced>(dispatcher);

            _startables.Add(cooksDispatcherQueue);

            var waiter = new Waiter(_publisher);

            var queuesToMonitor = new List <IMonitorableQueue>();

            queuesToMonitor.AddRange(cookHandlers);
            queuesToMonitor.Add(cooksDispatcherQueue);
            var queueMonitor = new QueueMonitor(queuesToMonitor);

            _startables.Add(queueMonitor);

            // Subscriptions
            _publisher.Subscribe(cooksDispatcherQueue);
            _publisher.Subscribe(asstManager);
            _publisher.Subscribe(cashierQueue);
            _publisher.Subscribe(printerHandler);

            _startables.ForEach(x => x.Start());

            bool shutdown      = false;
            int  ordersCreated = 0;

            while (!shutdown)
            {
                if (ordersCreated < 100)
                {
                    PlaceOrders(waiter, 5);
                    ordersCreated += 5;
                }

                var outstandingOrders = cashier.GetOutstandingOrders();

                PrintOutstandingOrders(outstandingOrders);

                foreach (var restaurantDocument in outstandingOrders)
                {
                    cashier.Pay(restaurantDocument.Id);
                }

                var outstandingOrdersAfterPay = cashier.GetOutstandingOrders();
                PrintOutstandingOrders(outstandingOrdersAfterPay);
                PrintDroppedMessages();
                Thread.Sleep(100);
            }
        }