Exemplo n.º 1
0
        public async Task <IActorResult> GetInternalRoutes(IMessage _)
        {
            var routes = internalRoutingTable.GetAllRoutes();

            var response = new InternalRoutesMessage
            {
                MessageHubs = routes.MessageHubs
                              .Select(mh => new ReceiverRegistration
                {
                    Identity          = mh.MessageHub.Identity,
                    LocalRegistration = mh.LocalRegistration
                })
                              .ToList(),
                MessageRoutes = routes.Actors
                                .Select(mr => new MessageRegistration
                {
                    Message = new MessageContract
                    {
                        Identity  = mr.Message.Identity,
                        Partition = mr.Message.Partition,
                        Version   = mr.Message.Version
                    },
                    Actors = mr.Actors
                             .Select(a => a.Identity)
                             .ToList()
                })
                                .ToList()
            };

            return(new ActorResult(Message.Create(response)));
        }
Exemplo n.º 2
0
        public void RegisterOwnGlobalRoutes(string domain)
        {
            var routes    = internalRoutingTable.GetAllRoutes();
            var contracts = GetActorRoutes(domain, routes).Concat(GetMessageHubRoutes(routes))
                            .ToList();

            if (contracts.Any())
            {
                clusterServices.GetClusterMonitor().RegisterSelf(contracts, domain);
            }
        }
Exemplo n.º 3
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}!");
                    }
                }
            }
        }