private static MonitorableQueueThreadHandler <T> CreateQueueThreadHandler <T>(IOrderHandler <T> cashier) where T : MessageBase { var cashierThread = new MonitorableQueueThreadHandler <T>(cashier); _startables.Add(cashierThread); return(cashierThread); }
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); } }