Example #1
0
        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;
            }
        }
Example #2
0
        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);
            }
        }