private bool HandleMessageLocally(InternalRouteLookupRequest lookupRequest, Message message) { var destinations = internalRoutingTable.FindRoutes(lookupRequest); foreach (var destination in destinations) { try { message = MessageCameFromLocalActor(message) ? message.Clone() : message; message.SetSocketIdentity(destination.As <ILocalSocket <IMessage> >().GetIdentity().Identity); destination.Send(message); RoutedToLocalActor(message); } catch (HostUnreachableException err) { //TODO: HostUnreachableException will never happen here, hence NetMQ sockets are not used //TODO: ILocalSocketShould throw similar exception, if no one is reading messages from the socket, //TODO: which should be a trigger for deletion of the ActorHost //TODO: When change is done, cover with unitests var removedRoutes = internalRoutingTable.RemoveReceiverRoute(destination) .Select(rr => new Cluster.MessageRoute { Receiver = rr.Receiver, Message = rr.Message }); if (removedRoutes.Any()) { clusterServices.GetClusterMonitor().UnregisterSelf(removedRoutes); } logger.Error(err); } } return(destinations.Any()); }
public Bcl.IEnumerable <ILocalSendingSocket <IMessage> > FindRoutes(InternalRouteLookupRequest lookupRequest) { HashedLinkedList <ReceiverIdentifier> actors; var sockets = new Bcl.List <ILocalSendingSocket <IMessage> >(); ILocalSendingSocket <IMessage> socket; if (lookupRequest.ReceiverIdentity.IsSet()) { if (lookupRequest.ReceiverIdentity.IsMessageHub()) { if (messageHubs.TryGetValue(lookupRequest.ReceiverIdentity, out socket)) { sockets.Add(socket); } } else { if (lookupRequest.ReceiverIdentity.IsActor()) { if (actorToSocketMap.TryGetValue(lookupRequest.ReceiverIdentity, out socket)) { if (messageToActorMap.TryGetValue(lookupRequest.Message, out actors)) { if (actors.Contains(lookupRequest.ReceiverIdentity)) { sockets.Add(socket); } } } } } } else { if (messageToActorMap.TryGetValue(lookupRequest.Message, out actors)) { if (lookupRequest.Distribution == DistributionPattern.Unicast) { if (actorToSocketMap.TryGetValue(Get(actors), out socket)) { sockets.Add(socket); } } else { if (lookupRequest.Distribution == DistributionPattern.Broadcast) { foreach (var actor in actors) { if (actorToSocketMap.TryGetValue(actor, out socket)) { sockets.Add(socket); } } } } } } return(sockets); }