示例#1
0
        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);
        }