Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
        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;
                }
            }
        }
Ejemplo n.º 3
0
        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();
        }
Ejemplo n.º 6
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();
        }
Ejemplo n.º 7
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;
            }
        }
Ejemplo n.º 8
0
        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;
                }
            }
        }