Esempio n. 1
0
 public void UpdateFlight(FlightStatusUpdate flight)
 {
     for (int i = 0; i < flights.Count; i++)
     {
         if (flights[i].FlightId == flight.FlightId)
         {
             flights[i].Status = flight.Status;
             return;
         }
     }
     flights.Add(flight);
 }
        public void Start()
        {
            var mqClient = new RabbitMqClient();

            mqClient.DeclareQueues(
                queues.ToArray()
                );
            mqClient.PurgeQueues(
                queues.ToArray()
                );

            bool isFinished = false;

            Task.Run(() =>
            {
                while (true)
                {
                    try
                    {
                        waitHandle.WaitOne();
                        if (isFinished)
                        {
                            break;
                        }
                        DateTime playTime;
                        lock (timeMessages)
                        {
                            if (!timeMessages.TryPop(out playTime))
                            {
                                continue;
                            }
                            timeMessages.Clear();
                        }
                        // DEBUG INFO
                        //Console.WriteLine($"{playTime} Start handling: {DateTime.Now.Millisecond}:{DateTime.Now.Ticks % 10000}");
                        var datetime = DateTime.Now;
                        //Console.WriteLine($"Handled Time: {playTime} Current system: {datetime}");
                        flightManager.SetCurrentTime(playTime);
                        //Thread.Sleep(1000);
                        foreach (var flight in flightManager.GetFlightChanges())
                        {
                            var statusUpdate = new FlightStatusUpdate()
                            {
                                FlightId      = flight.FlightId,
                                Status        = flight.Status,
                                DepartureTime = flight.DepartureTime,
                                TicketCount   = flight.Model.Seats
                            };

                            Console.WriteLine($"Flight update. Current system: {datetime}");
                            Console.WriteLine($"Id: {flight.FlightId}.");
                            Console.WriteLine($"Status: {flight.Status}.");
                            Console.WriteLine($"DepartureTime: {flight.DepartureTime}");
                            Console.WriteLine($"TicketCount: {flight.Model.Seats}");
                            Console.WriteLine();

                            mqClient.Send(
                                ScheduleToTimetableQueue,
                                statusUpdate);
                            if (statusUpdate.Status == FlightStatus.New)
                            {
                                mqClient.Send(ScheduleToAirplaneQueue, new AirplaneGenerationRequest()
                                {
                                    AirplaneModelName = flight.Model.Model,
                                    FlightId          = flight.FlightId
                                });
                            }
                            if (statusUpdate.Status != FlightStatus.Delayed)
                            {
                                mqClient.Send(ScheduleToRegistrationQueue, statusUpdate);
                                if (statusUpdate.Status != FlightStatus.CheckIn)
                                {
                                    mqClient.Send(ScheduleToCashboxQueue, statusUpdate);
                                }
                            }
                        }
                        foreach (var flight in flightManager.GetFlightsToDeparture())
                        {
                            Console.WriteLine("Flight to departure.");
                            Console.WriteLine($"Id: {flight.FlightId}.");
                            Console.WriteLine($"Status: {flight.Status}.");
                            Console.WriteLine($"DepartureTime: {flight.DepartureTime}");
                            Console.WriteLine($"TicketCount: {flight.Model.Seats}");
                            Console.WriteLine();
                            mqClient.Send(ScheduleToGroundServiceQueue, new AirplaneDepartureTimeSignal()
                            {
                                FlightId = flight.FlightId,
                                PlaneId  = flight.PlaneId
                            });
                        }
                    } catch (Exception e)
                    {
                        Console.WriteLine(e);
                    }
                    // DEBUG INFO
                    //Console.WriteLine($"{playTime}   End handling: {DateTime.Now.Millisecond}:{DateTime.Now.Ticks % 10000}");
                }
            });

            mqClient.SubscribeTo <CurrentPlayTime>(TimeServiceToScheduleQueue, (mes) =>
            {
                // DEBUG INFO
                //Console.WriteLine($"{mes.PlayTime} Start handling: {DateTime.Now.Millisecond}:{DateTime.Now.Ticks % 10000}");
                Console.WriteLine($"Received Time: {mes.PlayTime}");
                timeMessages.Push(mes.PlayTime);
                waitHandle.Set();
                // DEBUG INFO
                //Console.WriteLine($"{mes.PlayTime}   End handling: {DateTime.Now.Millisecond}:{DateTime.Now.Ticks % 10000}");
            });

            mqClient.SubscribeTo <AirplaneServiceStatus>(GroundServiceToScheduleQueue, (mes) =>
            {
                flightManager.UpdateStatusByPlaneId(mes.PlaneId, mes.Status);
            });

            mqClient.SubscribeTo <AirplaneGenerationResponse>(AirplaneToScheduleQueue, (mes) =>
            {
                flightManager.SetPlaneForFlight(mes.FlightId, mes.PlaneId);
            });

            Console.ReadLine();
            mqClient.Dispose();
            isFinished = true;
            waitHandle.Set();
        }