public void Handle(InternalRouteRegistration routeRegistration)
 {
     if (routeRegistration.ReceiverIdentifier.IsMessageHub() ||
         routeRegistration.ReceiverIdentifier.IsActor() && routeRegistration.MessageContracts?.Any() == true)
     {
         internalRoutingTable.AddMessageRoute(routeRegistration);
         var routesByDomain = GetActors(routeRegistration).Concat(GetMessageHubs(routeRegistration))
                              .GroupBy(mh => mh.Domain);
         foreach (var route in routesByDomain)
         {
             clusterMonitor.RegisterSelf(route.Select(r => r.MessageRoute), route.Key);
         }
     }
 }
Beispiel #2
0
        public void Handle(IMessage message, ISocket _)
        {
            if (securityProvider.DomainIsAllowed(message.Domain))
            {
                message.As <Message>().VerifySignature(securityProvider);

                var payload        = message.GetPayload <DiscoverMessageRouteMessage>();
                var internalRoutes = internalRoutingTable.GetAllRoutes();
                var messageRoutes  = new List <Cluster.MessageRoute>();
                if (payload.ReceiverIdentity.IsMessageHub())
                {
                    messageRoutes.AddRange(internalRoutes.MessageHubs
                                           .Where(mh => !mh.LocalRegistration &&
                                                  mh.MessageHub.Equals(new ReceiverIdentifier(payload.ReceiverIdentity)))
                                           .Select(mh => new Cluster.MessageRoute {
                        Receiver = mh.MessageHub
                    }));
                }
                else
                {
                    var messageContract = new MessageIdentifier(payload.MessageContract.Identity, payload.MessageContract.Version, payload.MessageContract.Partition);
                    messageRoutes.AddRange(internalRoutes.Actors
                                           .Where(r => r.Message.Equals(messageContract))
                                           .SelectMany(r => r.Actors
                                                       .Where(a => !a.LocalRegistration)
                                                       .Select(a => new Cluster.MessageRoute
                    {
                        Receiver = a,
                        Message  = messageContract
                    })));
                }
                foreach (var messageRoute in messageRoutes)
                {
                    var domains = messageRoute.Receiver.IsMessageHub()
                                      ? securityProvider.GetAllowedDomains()
                                      : new[] { securityProvider.GetDomain(messageRoute.Message.Identity) };
                    if (domains.Contains(message.Domain))
                    {
                        clusterMonitor.RegisterSelf(messageRoute.ToEnumerable(), message.Domain);
                    }
                    else
                    {
                        logger.Warn($"MessageIdentity {messageRoute.Message} doesn't belong to requested Domain {message.Domain}!");
                    }
                }
            }
        }