protected override void OnReceive(object message)
{
if (message is Terminated)
{
var terminated = (Terminated)message;
if (_child != null && _child.Equals(terminated.ActorRef))
{
_child = null;
var rand = 1.0 + ThreadLocalRandom.Current.NextDouble() * _randomFactor;
TimeSpan restartDelay;
if (_restartCount >= 30)
restartDelay = _maxBackoff; // duration overflow protection (> 100 years)
else
{
var max = Math.Min(_maxBackoff.Ticks, _minBackoff.Ticks * Math.Pow(2, _restartCount)) * rand;
if (max >= Double.MaxValue) restartDelay = _maxBackoff;
else restartDelay = new TimeSpan((long)max);
}
Context.System.Scheduler.ScheduleTellOnce(restartDelay, Self, StartChild.Instance, Self);
_restartCount++;
}
else Unhandled(message);
}
else if (message is StartChild)
{
StartChildActor();
Context.System.Scheduler.ScheduleTellOnce(_minBackoff, Self, new ResetRestartCount(_restartCount), Self);
}
else if (message is ResetRestartCount)
{
var restartCount = (ResetRestartCount)message;
if (restartCount.Current == _restartCount) _restartCount = 0;
}
else if (message is GetCurrentChild)
{
Sender.Tell(new CurrentChild(_child));
}
else
{
if (_child != null) _child.Forward(message);
else Context.System.DeadLetters.Forward(message);
}
}