protected override void OnReceive(object message)
{
message.Match()
.With<ClusterEvent.CurrentClusterState>(HandleInitial)
.With<ClusterEvent.MemberUp>(m => Add(m.Member))
.With<ClusterEvent.MemberExited>(m => Remove(m.Member))
.With<ClusterEvent.MemberRemoved>(m => Remove(m.Member))
.With<ActorIdentity>(identity =>
{
if (identity.Subject != null)
{
// if the new singleton is defined, deliver all buffered messages
var subject = identity.Subject;
Log.Info("Singleton identified at [{0}]", subject.Path);
_singleton = subject;
Context.Watch(subject);
CancelTimer();
SendBuffered();
}
})
.With<TryToIdentifySingleton>(() =>
{
var oldest = _membersByAge.FirstOrDefault();
if (oldest != null && _identityTimer != null)
{
var singletonAddress = new RootActorPath(oldest.Address) / _singletonPath;
Log.Debug("Trying to identify singleton at [{0}]", singletonAddress);
Context.ActorSelection(singletonAddress).Tell(new Identify(_identityId));
}
})
.With<Terminated>(terminated =>
{
if (Equals(_singleton, terminated.ActorRef))
{
// buffering mode, identification of new will start when old node is removed
_singleton = null;
}
})
.Default(msg =>
{
if (_singleton != null)
{
if (Log.IsDebugEnabled)
Log.Debug("Forwarding message of type [{0}] to current singleton instance at [{1}]", msg.GetType(), _singleton.Path);
_singleton.Forward(msg);
}
else
Buffer(msg);
});
}