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 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); } }