public void PassPassengers(string busId, string flightId, int capacity) { lock (flightLock) { var flight = Flights.Find(e => e.FlightId == flightId); if (flight == null) { return; } int count = flight.Passengers.Count; int passCount = (count > capacity) ? capacity : count; var passengers = flight.Passengers.GetRange(0, passCount); MqClient.Send <PassengersFromStorageResponse>(storageBus, new PassengersFromStorageResponse() { BusId = busId, PassengersCount = passCount, PassengersIds = passengers }); Console.WriteLine($"Sent to Bus: {busId}, {passCount}"); flight.Passengers.RemoveRange(0, passCount); MqClient.Send <PassengerPassMessage>(storagePas, new PassengerPassMessage() { ObjectId = busId, Status = PassengerStatus.InBus, PassengersIds = passengers }); Console.WriteLine($"Sent to Passenger: in {busId}"); TryToRemove(flightId); } }
public void UpdateFlightStatus(string id, FlightStatus status) { lock (Flights) { switch (status) { case FlightStatus.New: Flights.Add(new Flight() { FlightId = id, Status = status }); Console.WriteLine($"Added new flight {id}"); break; case FlightStatus.CheckIn: Flights.Find(e => (e.FlightId == id)).Status = status; Console.WriteLine($"Added check-in: {id} - {status}"); break; case FlightStatus.Boarding: var boarding = Flights.Find(e => (e.FlightId == id)); boarding.Status = status; Console.WriteLine($"Added boarding: {id} - {status}"); MqClient.Send( regGrServ, new FlightInfo() { FlightId = id, PassengerCount = boarding.PasCount, BaggageCount = boarding.BagCount, FoodList = new List <Tuple <Food, int> >() { Tuple.Create(Food.Standard, boarding.StandardFood), Tuple.Create(Food.Vegan, boarding.VeganFood), Tuple.Create(Food.Child, boarding.ChildFood), } } ); Console.WriteLine($"Sent to Ground Service: {id}, {boarding.PasCount}, {boarding.BagCount}, {boarding.StandardFood}, {boarding.VeganFood}, {boarding.ChildFood}"); break; case FlightStatus.Departed: Flights.Find(e => (e.FlightId == id)).Status = status; Console.WriteLine($"Added departed: {id} - {status}"); break; default: break; } } }
public void PassBaggage(string carId, string flightId, int capacity) { lock (flightLock) { var flight = Flights.Find(e => e.FlightId == flightId); if (flight == null) { return; } int count = (flight.Baggage > capacity) ? capacity : flight.Baggage; MqClient.Send <BaggageFromStorageResponse>(storageBaggage, new BaggageFromStorageResponse() { BaggageCarId = carId, BaggageCount = count }); Console.WriteLine($"Sent to Baggage car: {carId}, {count}"); flight.Baggage -= count; TryToRemove(flightId); } }
private static void StartClient(int totalLoops, int totalMessages, int totalFrames, int frameSize) { var cl = new MqClient <SimpleMqSession, MqConfig>(new MqConfig() { Ip = "127.0.0.1", Port = 2828 }); var stopwatch = new Stopwatch(); var messageReader = new MqMessageReader(); var messageSize = totalFrames * frameSize; var message = new MqMessage(); double[] totalValues = { 0, 0, 0 }; for (int i = 0; i < totalFrames; i++) { message.Add(new MqFrame(SequentialBytes(frameSize), MqFrameType.More, (MqConfig)cl.Config)); } cl.IncomingMessage += (sender, args) => { MqMessage msg; while (args.Messages.Count > 0) { msg = args.Messages.Dequeue(); messageReader.Message = msg; var result = messageReader.ReadString(); if (result == "COMPLETE") { if (totalLoops-- > 0) { stopwatch.Stop(); var messagesPerSecond = (int)((double)totalMessages / stopwatch.ElapsedMilliseconds * 1000); var msgSizeNoHeader = messageSize; var mbps = totalMessages * (double)(msgSizeNoHeader) / stopwatch.ElapsedMilliseconds / 1000; Console.WriteLine("| {0,10:N0} | {1,9:N0} | {2,12:N0} | {3,10:N0} | {4,8:N2} |", totalMessages, msgSizeNoHeader, stopwatch.ElapsedMilliseconds, messagesPerSecond, mbps); totalValues[0] += stopwatch.ElapsedMilliseconds; totalValues[1] += messagesPerSecond; totalValues[2] += mbps; } if (totalLoops == 0) { Console.WriteLine("| | AVERAGES | {0,12:N0} | {1,10:N0} | {2,8:N2} |", totalValues[0] / totalLoops, totalValues[1] / totalLoops, totalValues[2] / totalLoops); Console.WriteLine(); Console.WriteLine("Test complete"); } cl.Close(); } else if (result == "START") { if (totalLoops > 0) { stopwatch.Restart(); for (var i = 0; i < totalMessages; i++) { cl.Send(message); } } } } }; cl.Connect(); }
private static void MqInProcessPerformanceTests(int runs, int loops, MqMessage message, MqConfig config) { var server = new MqServer <SimpleMqSession, MqConfig>(config); server.Start(); double[] totalValues = { 0, 0, 0 }; var count = 0; var sw = new Stopwatch(); var wait = new AutoResetEvent(false); var completeTest = new AutoResetEvent(false); var client = new MqClient <SimpleMqSession, MqConfig>(config); Console.WriteLine("| Build | Messages | Msg Bytes | Milliseconds | Msg/sec | MBps |"); Console.WriteLine("|---------|------------|-----------|--------------|------------|----------|"); var messageSize = message.Size; server.IncomingMessage += (sender, args2) => { count += args2.Messages.Count; if (count == runs) { sw.Stop(); var mode = "Release"; #if DEBUG mode = "Debug"; #endif var messagesPerSecond = (int)((double)runs / sw.ElapsedMilliseconds * 1000); var msgSizeNoHeader = messageSize - 12; var mbps = runs * (double)(msgSizeNoHeader) / sw.ElapsedMilliseconds / 1000; Console.WriteLine("| {0,7} | {1,10:N0} | {2,9:N0} | {3,12:N0} | {4,10:N0} | {5,8:N2} |", mode, runs, msgSizeNoHeader, sw.ElapsedMilliseconds, messagesPerSecond, mbps); totalValues[0] += sw.ElapsedMilliseconds; totalValues[1] += messagesPerSecond; totalValues[2] += mbps; wait.Set(); } }; var send = new Action(() => { count = 0; sw.Restart(); for (var i = 0; i < runs; i++) { client.Send(message); } //MqServer sv = server; wait.WaitOne(); wait.Reset(); }); client.Connected += (sender, args) => { for (var i = 0; i < loops; i++) { send(); } Console.WriteLine("| | | AVERAGES | {0,12:N0} | {1,10:N0} | {2,8:N2} |", totalValues[0] / loops, totalValues[1] / loops, totalValues[2] / loops); Console.WriteLine(); server.Stop(); client.Close(); completeTest.Set(); }; client.Connect(); completeTest.WaitOne(); }
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; } }
public void PassToTerminal(string passengerId, string flightId, bool baggage, Food food) { var rand = new Random().NextDouble(); if (rand < 0.2) // Вероятность лагания пассажира - 20% { var errorTime = new Random().Next(MIN_ERR_MS, MAX_ERR_MS); DelaySource.CreateToken().Sleep(errorTime); } lock (Flights) { var flight = Flights.Find(e => e.FlightId == flightId); var status = flight.Status; if (status == FlightStatus.Boarding || status == FlightStatus.Departed) { MqClient.Send( regPas, new CheckInResponse() { PassengerId = passengerId, Status = CheckInStatus.LateForTerminal } ); Console.WriteLine($"Sent to Passenger: {passengerId}, {CheckInStatus.LateForTerminal}"); return; } // Отправить пассажира в накопитель MqClient.Send(regStorage, new PassengerStoragePass() { PassengerId = passengerId, FlightId = flightId }); flight.PasCount++; MqClient.Send( regPas, new CheckInResponse() { PassengerId = passengerId, Status = CheckInStatus.Terminal } ); if (baggage) { // Отправить багаж в накопитель - Накопитель(flightId) MqClient.Send(regStorageBaggage, new BaggageStoragePass() { FlightId = flightId }); flight.BagCount++; } // Добавить еду для рейса switch (food) { case Food.Standard: flight.StandardFood++; break; case Food.Vegan: flight.VeganFood++; break; case Food.Child: flight.ChildFood++; break; default: break; } } }