protected override void OnReceive(object message) { switch (message) { case RespondTemperature m when m.RequestId == TemperatureRequestCorrelationId: ITemperatureQueryReading reading = null; if (m.Temperature.HasValue) { reading = new TemperatureAvailable(m.Temperature.Value); } else { reading = NoTemperatureReadingRecordedYet.Instance; } RecordSensorResponse(Sender, reading); break; case QueryTimeout m: foreach (var sensor in StillAwaitingReplay) { var sensorId = ActorToSensorId[sensor]; RepliesReceived.Add(sensorId, TemperatureSensorTimedOut.Instance); } QueryRequester.Tell(new RespondAllTemperatures(RequestId, RepliesReceived.ToImmutableDictionary())); Context.Stop(Self); break; case Terminated m: RecordSensorResponse(m.ActorRef, TemperatureSensorNotAvailable.Instance); break; default: 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); } }
private void RecordSenderResponse(IActorRef deviceActor, ITemperatureQueryReading reading) { Context.Unwatch(deviceActor); var deviceId = _actorToDeviceId[deviceActor]; _stillAwaitingReply.Remove(deviceActor); _repliesReceived.Add(deviceId, reading); var allRepliesHaveBeenReceived = _stillAwaitingReply.Count == 0; if (allRepliesHaveBeenReceived) { _requester.Tell(new RespondAllTemperatures( _requestId, _repliesReceived.ToImmutableDictionary())); Context.Stop(Self); } }
private void RecordSensorResponse(IActorRef sender, ITemperatureQueryReading reading) { Context.Unwatch(sender); var sensorId = ActorToSensorId[sender]; StillAwaitingReplay.Remove(sender); RepliesReceived.Add(sensorId, reading); var allRepliesHaveBeenReceived = StillAwaitingReplay.Count == 0; if (allRepliesHaveBeenReceived) { QueryRequester.Tell(new RespondAllTemperatures( RequestId, RepliesReceived.ToImmutableDictionary() )); Context.Stop(Self); } }