예제 #1
0
 public BaggageCar(int id)
 {
     LocationVertex  = RandomHomeVertex.GetHomeVertex();
     BaggageCarID    = "Baggage-" + id;
     MotionPermitted = false;
     Status          = Status.Free;
 }
예제 #2
0
        //C СЛУЖБОЙ НАЗЕМНОГО ОБСЛУЖИВАНИЯ
        private void MessageFromGroundService() //забрать/сдать багаж на самолет
        {
            mqClient.SubscribeTo <BaggageServiceCommand>(queueFromGroundService, (bsc) =>
            {
                Console.WriteLine(DateTime.Now + " " + Component.Baggage + " Получил сообщение от СНО");
                new Task(() =>
                {
                    int numOfCars = bsc.BaggageCount / BaggageCar.MaxCountOfBaggage; //сколько машин нужно выделить под задачу
                    if ((bsc.BaggageCount % BaggageCar.MaxCountOfBaggage) > 0)
                    {
                        numOfCars++;
                    }
                    Console.WriteLine($"{bsc.BaggageCount} багажа нужно");
                    Console.WriteLine(numOfCars + " машин нужно для задачи");

                    int carsEndWork = numOfCars;


                    if (bsc.Action == TransferAction.Give)
                    {
                        for (int i = 0; i < numOfCars; i++)
                        {
                            Console.WriteLine("ищем свободную машину");
                            BaggageCar car = SearchFreeCar();
                            Console.WriteLine($"нашли {car.BaggageCarID} ");
                            Task t = new Task(() =>
                            {
                                //поехать к накопителю
                                GoPath(GoToVertexAlone, car, storageVertex);
                                Console.WriteLine($"{DateTime.Now} {car.BaggageCarID} приехала к накопителю");

                                ToStorageRequest(car.BaggageCarID, bsc.FlightId, BaggageCar.MaxCountOfBaggage);
                                Console.WriteLine($"{DateTime.Now} {car.BaggageCarID} запросила багаж у накопителя");

                                //поехать к самолёту
                                GoPath(GoToVertexAlone, car, bsc.PlaneLocationVertex);
                                Console.WriteLine($"{DateTime.Now} {car.BaggageCarID} приехала к самолёту");
                                //отдаём багаж самолёту
                                sourceDelay.CreateToken().Sleep(2 * 60 * 1000); //отдаём багаж 15 минут
                                TakeOrGiveBaggageFromPlane(bsc.PlaneId, car.BaggageCarID, TransferAction.Give, car.CountOfBaggage);
                                car.CountOfBaggage = 0;
                                Console.WriteLine($"{DateTime.Now} {car.BaggageCarID} отдала багаж самолёту");

                                carsEndWork--;                              //машина обслужила самолёт

                                var source = new CancellationTokenSource(); //adds token and remove it after went home/new cmd
                                tokens.TryAdd(car.BaggageCarID, source);
                                //вернуться на стоянку
                                GoPathHome(car, RandomHomeVertex.GetHomeVertex(), tokens[car.BaggageCarID]);
                                tokens.Remove(car.BaggageCarID, out source);
                            });

                            carTasks.TryAdd(car.BaggageCarID, t);
                            t.Start();
                        }
                    }
                    else if (bsc.Action == TransferAction.Take)
                    {
                        for (int i = 0; i < numOfCars; i++)
                        {
                            BaggageCar car = SearchFreeCar();
                            Task t         = new Task(() =>
                            {
                                //поехать к самолёту
                                GoPath(GoToVertexAlone, car, bsc.PlaneLocationVertex);
                                Console.WriteLine($"{DateTime.Now} {car.BaggageCarID} приехала к самолёту");

                                sourceDelay.CreateToken().Sleep(2 * 60 * 1000); //забираем багаж 15 минут
                                TakeOrGiveBaggageFromPlane(bsc.PlaneId, car.BaggageCarID, TransferAction.Take, car.CountOfBaggage);
                                Console.WriteLine($"{DateTime.Now} {car.BaggageCarID} забрала багаж у самолёта");

                                carsEndWork--; //машина обслужила самолёт

                                //поехать к накопителю (багаж отдавать не надо)
                                GoPath(GoToVertexAlone, car, storageVertex);
                                car.CountOfBaggage = 0;
                                Console.WriteLine($"{DateTime.Now} {car.BaggageCarID} приехала к накопителю");

                                var source = new CancellationTokenSource();     //adds token and remove it after went home/new cmd
                                tokens.TryAdd(car.BaggageCarID, source);
                                //едем на стоянку
                                GoPathHome(car, RandomHomeVertex.GetHomeVertex(), tokens[car.BaggageCarID]);
                                tokens.Remove(car.BaggageCarID, out source);
                            });
                            carTasks.TryAdd(car.BaggageCarID, t);
                            t.Start();
                        }
                    }


                    //ждём, пока все машины не завершат работу
                    while (carsEndWork != 0)
                    {
                        sourceDelay.CreateToken().Sleep(100);
                    }
                    //отправляем СНО сообщение о том, что обслуживание самолёта завершено
                    ServiceCompletionMessage mes = new ServiceCompletionMessage()
                    {
                        Component = Component.Baggage,
                        PlaneId   = bsc.PlaneId
                    };
                    mqClient.Send <ServiceCompletionMessage>(queueToGroundService, mes);
                    Console.WriteLine($"{DateTime.Now} завершено обслуживание самолёта");
                }).Start();
            });
        }