private Receive Active(IActorRef receptionist)
{
return message =>
message.Match()
.With<Send>(send =>
receptionist.Forward(new PublishSubscribe.Send(send.Path, send.Message, send.LocalAffinity)))
.With<SendToAll>(toAll =>
receptionist.Forward(new PublishSubscribe.SendToAll(toAll.Path, toAll.Message)))
.With<Publish>(publish =>
receptionist.Forward(new PublishSubscribe.Publish(publish.Topic, publish.Message)))
.With<InternalMessage>(m =>
{
switch (m)
{
case InternalMessage.HeartbeatTick:
if (!_failureDetector.IsAvailable)
{
Log.Info("Lost contact with [{0}], restablishing connection", receptionist);
SendGetContacts();
ScheduleRefreshContactsTick(Settings.EstablishingGetContactsInterval);
Context.Become(Establishing);
_failureDetector.HeartBeat();
}
else
{
receptionist.Tell(ClusterReceptionist.Heartbeat.Instance);
}
break;
case InternalMessage.RefreshContactsTick:
receptionist.Tell(ClusterReceptionist.GetContacts.Instance);
break;
}
})
.With<ClusterReceptionist.HeartbeatRsp>(_ => _failureDetector.HeartBeat())
.With<ClusterReceptionist.Contacts>(contacts =>
{
if (contacts.ContactPoints.Length != 0)
_contacts = contacts.ContactPoints.Select(Context.ActorSelection).ToArray();
})
.With<Terminated>(terminated =>
{
Log.Info("Lost contact with [{0}], restablishing connection", receptionist);
SendGetContacts();
ScheduleRefreshContactsTick(Settings.EstablishingGetContactsInterval);
Context.Become(Establishing);
})
.With<ActorIdentity>(_ => { /* ok, from previous establish, already handled */ })
.WasHandled;
}