Beispiel #1
0
        public void Start()
        {
            MqClient.DeclareQueues(queues.ToArray());
            MqClient.PurgeQueues(queues.ToArray());

            MqClient.SubscribeTo <NewTimeSpeedFactor>(timeReg, (mes) =>
            {
                DelaySource.TimeFactor = mes.Factor;
            });

            MqClient.SubscribeTo <FlightStatusUpdate>(scheduleReg, (mes) =>
            {
                Console.WriteLine($"Received from Schedule: {mes.FlightId} - {mes.Status}");
                UpdateFlightStatus(mes.FlightId, mes.Status);
            });

            Task.Run(() =>
            {
                while (true)
                {
                    checkInEvent.WaitOne();

                    while (checkInRequests.TryDequeue(out var request))
                    {
                        DelaySource.CreateToken().Sleep(REG_TIME_MS);
                        Registrate(
                            request.PassengerId,
                            request.FlightId,
                            request.HasBaggage,
                            request.FoodType
                            );
                    }
                }
            });

            MqClient.SubscribeTo <CheckInRequest>(pasReg, (mes) =>
            {
                Console.WriteLine($"Received from Passenger: {mes.PassengerId}, {mes.FlightId}, {mes.HasBaggage}, {mes.FoodType}");
                checkInRequests.Enqueue(mes);
                checkInEvent.Set();
            });

            // Ответ кассы
            MqClient.SubscribeTo <CheckTicketResponse>(cashReg, (mes) =>
            {
                lock (PasList)
                {
                    var match = PasList.Find(e => (e.PassengerId == mes.PassengerId));
                    if (match != null)
                    {
                        if (mes.HasTicket) // Если билет верный
                        {
                            MqClient.Send(regPas,
                                          new CheckInResponse()
                            {
                                PassengerId = mes.PassengerId, Status = CheckInStatus.Registered
                            }
                                          );
                            Console.WriteLine($"Sent to Passenger: {mes.PassengerId}, {CheckInStatus.Registered}");
                            Task.Run(() =>
                            {
                                PassToTerminal(match.PassengerId, match.FlightId, match.HasBaggage, match.FoodType);
                            });
                        }
                        else // Если билет неверный
                        {
                            MqClient.Send(regPas,
                                          new CheckInResponse()
                            {
                                PassengerId = mes.PassengerId, Status = CheckInStatus.WrongTicket
                            }
                                          );
                            Console.WriteLine($"Sent to Passenger: {mes.PassengerId}, {CheckInStatus.WrongTicket}");
                        }

                        PasList.Remove(match);
                    }
                }
            });

            //MqClient.Dispose();
        }
Beispiel #2
0
        public void Registrate(string passengerId, string flightId, bool hasBaggage, Food foodType)
        {
            Flight flight;

            lock (Flights)
            {
                flight = Flights.Find(e => e.FlightId == flightId);
            }

            if (flight == null)
            {
                MqClient.Send(
                    regPas,
                    new CheckInResponse()
                {
                    PassengerId = passengerId, Status = CheckInStatus.NoSuchFlight
                }
                    );
                Console.WriteLine($"Sent to Passenger: {passengerId}, {CheckInStatus.NoSuchFlight}");
                return;
            }

            switch (flight.Status)
            {
            case FlightStatus.New:
                MqClient.Send(
                    regPas,
                    new CheckInResponse()
                {
                    PassengerId = passengerId, Status = CheckInStatus.Early
                }
                    );
                Console.WriteLine($"Sent to Passenger: {passengerId}, {CheckInStatus.Early}");
                break;

            case FlightStatus.Boarding:
            case FlightStatus.Delayed:
            case FlightStatus.Departed:
                MqClient.Send(
                    regPas,
                    new CheckInResponse()
                {
                    PassengerId = passengerId, Status = CheckInStatus.Late
                }
                    );
                Console.WriteLine($"Sent to Passenger: {passengerId}, {CheckInStatus.Late}");
                break;

            case FlightStatus.CheckIn:
                lock (PasList)
                {
                    PasList.Add(
                        new CheckInRequest()
                    {
                        PassengerId = passengerId,
                        FlightId    = flightId,
                        HasBaggage  = hasBaggage,
                        FoodType    = foodType
                    }
                        );
                }
                // Отправить запрос кассе на проверку билета
                MqClient.Send(
                    regCash,
                    new CheckTicketRequest()
                {
                    PassengerId = passengerId, FlightId = flightId
                }
                    );
                Console.WriteLine($"Sent to CashBox: {passengerId}, {flightId}");
                break;
            }
        }