protected override void OnReceive(object message) { switch (message) { case RespondTemperature m when m.RequestId == TemperatureRequestCorrelactionId: if (m.Temperature.HasValue) { var temperatureAvailable = new TemperatureAvailable(m.Temperature.Value); RecordTemperatureReading(Context.Sender, temperatureAvailable); } else { RecordTemperatureReading(Context.Sender, NoTemperatureAvailable.Instance); } break; case Terminated m: RecordTemperatureReading(Context.Sender, SensorNotAvailable.Instance); break; case TemperatureQueryCanceled m: foreach (var sensorActor in ActorRefToSensorId.Keys) { Readings.Add(ActorRefToSensorId[sensorActor], SensorTimedOut.Instance); } Requester.Tell(new RespondFloorTemperatures(RequestId, Readings.ToImmutableDictionary())); Context.Stop(Self); break; default: Unhandled(message); break; } }
private void RecordTemperatureReading(IActorRef sensor, ITemperatureQueryReading temperatureReading) { var sensorId = ActorRefToSensorId[sensor]; Context.Unwatch(sensor); ActorRefToSensorId.Remove(sensor); Readings.Add(sensorId, temperatureReading); if (ActorRefToSensorId.Count == 0) { Requester.Tell(new RespondFloorTemperatures(RequestId, Readings.ToImmutableDictionary())); Context.Stop(Self); } }