/// <summary> /// Handle SimulatePassingCar message. /// </summary> /// <param name="msg">The message to handle.</param> private void Handle(SimulatePassingCar msg) { // simulate car entry int entryLane = _rnd.Next(1, 4); ActorSelection entryCamera = Context.System.ActorSelection($"/user/entrycam{entryLane}"); DateTime entryTimestamp = DateTime.Now; VehiclePassed vehiclePassed = new VehiclePassed(msg.VehicleId, entryTimestamp); entryCamera.Tell(vehiclePassed); // simulate car exit int exitLane = _rnd.Next(1, 4); TimeSpan delay = TimeSpan.FromSeconds(_rnd.Next(_minExitDelayInS, _maxExitDelayInS) + _rnd.NextDouble()); DateTime exitTimestamp = entryTimestamp.Add(delay); ActorSelection exitCamera = Context.System.ActorSelection($"/user/exitcam{entryLane}"); vehiclePassed = new VehiclePassed(msg.VehicleId, exitTimestamp); Context.System.Scheduler.ScheduleTellOnce(delay, exitCamera, vehiclePassed, Self); // handle progress _carsSimulated++; if (_carsSimulated < _numberOfCars) { SimulatePassingCar simulatePassingCar = new SimulatePassingCar(GenerateRandomLicenseNumber()); Context.System.Scheduler.ScheduleTellOnce( _rnd.Next(_minEntryDelayInMS, _maxEntryDelayInMS), Self, simulatePassingCar, Self); } else { Self.Tell(new Shutdown()); } }
/// <summary> /// Handle StartSimulation message. /// </summary> /// <param name="msg">The message to handle.</param> private void Handle(StartSimulation msg) { // initialize state _numberOfCars = msg.NumberOfCars; _carsSimulated = 0; _rnd = new Random(); // start simulationloop SimulatePassingCar simulatePassingCar = new SimulatePassingCar(GenerateRandomLicenseNumber()); Context.System.Scheduler.ScheduleTellOnce( _rnd.Next(_minEntryDelayInMS, _maxEntryDelayInMS), Self, simulatePassingCar, Self); }