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(); }
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; } }