コード例 #1
0
        public UnicastRoutingStrategy Route(Type messageType, IDistributionPolicy distributionPolicy)
        {
            var route = unicastRoutingTable.GetRouteFor(messageType);

            if (route == null)
            {
                return(null);
            }

            if (route.PhysicalAddress != null)
            {
                return(new UnicastRoutingStrategy(route.PhysicalAddress));
            }

            if (route.Instance != null)
            {
                return(new UnicastRoutingStrategy(transportAddressTranslation(route.Instance)));
            }


            var instances = endpointInstances.FindInstances(route.Endpoint).Select(e => transportAddressTranslation(e)).ToArray();
            var selectedInstanceAddress = distributionPolicy.GetDistributionStrategy(route.Endpoint, DistributionStrategyScope.Send).SelectReceiver(instances);

            return(new UnicastRoutingStrategy(selectedInstanceAddress));
        }
コード例 #2
0
 public UnicastRouter(BlueprintBasedRouteGenerator routeGenerator, EndpointInstances endpointInstances, IDistributionPolicy distributionPolicy, Func <EndpointInstance, string> resolveTransportAddress)
 {
     this.routeGenerator          = routeGenerator;
     this.endpointInstances       = endpointInstances;
     this.distributionPolicy      = distributionPolicy;
     this.resolveTransportAddress = resolveTransportAddress;
 }
コード例 #3
0
        HashSet<string> SelectDestinationsForEachEndpoint(IDistributionPolicy distributionPolicy, IEnumerable<Subscriber> subscribers)
        {
            //Make sure we are sending only one to each transport destination. Might happen when there are multiple routing information sources.
            var addresses = new HashSet<string>();
            var destinationsByEndpoint = subscribers
                .GroupBy(d => d.Endpoint, d => d);

            foreach (var group in destinationsByEndpoint)
            {
                if (group.Key == null) //Routing targets that do not specify endpoint name
                {
                    //Send a message to each target as we have no idea which endpoint they represent
                    foreach (var subscriber in group)
                    {
                        addresses.Add(subscriber.TransportAddress);
                    }
                }
                else
                {
                    var subscriber = distributionPolicy.GetDistributionStrategy(group.First().Endpoint, DistributionStrategyScope.Publish).SelectReceiver(group.Select(s => s.TransportAddress).ToArray());
                    addresses.Add(subscriber);
                }
            }

            return addresses;
        }
コード例 #4
0
 public PublishRoutingConnector(UnicastSubscriberTable routingTable, EndpointInstances endpointInstances, IDistributionPolicy distributionPolicy, Func <EndpointInstance, string> resolveTransportAddress)
 {
     this.routingTable            = routingTable;
     this.endpointInstances       = endpointInstances;
     this.distributionPolicy      = distributionPolicy;
     this.resolveTransportAddress = resolveTransportAddress;
 }
コード例 #5
0
        HashSet <string> SelectDestinationsForEachEndpoint(IDistributionPolicy distributionPolicy, IEnumerable <Subscriber> subscribers)
        {
            //Make sure we are sending only one to each transport destination. Might happen when there are multiple routing information sources.
            var addresses = new HashSet <string>();
            var destinationsByEndpoint = subscribers
                                         .GroupBy(d => d.Endpoint, d => d);

            foreach (var group in destinationsByEndpoint)
            {
                if (group.Key == null) //Routing targets that do not specify endpoint name
                {
                    //Send a message to each target as we have no idea which endpoint they represent
                    foreach (var subscriber in group)
                    {
                        addresses.Add(subscriber.TransportAddress);
                    }
                }
                else
                {
                    var subscriber = distributionPolicy.GetDistributionStrategy(group.First().Endpoint, DistributionStrategyScope.Publish).SelectReceiver(group.Select(s => s.TransportAddress).ToArray());
                    addresses.Add(subscriber);
                }
            }

            return(addresses);
        }
コード例 #6
0
 public TopicExchangeAddressManager(string topicExchangeName, EndpointInstances endpointInstances, Func <EndpointInstance, string> transportAddressTranslation, IDistributionPolicy distributionPolicy)
 {
     this.topicExchangeName           = topicExchangeName;
     this.endpointInstances           = endpointInstances;
     this.transportAddressTranslation = transportAddressTranslation;
     this.distributionPolicy          = distributionPolicy;
 }
コード例 #7
0
 public Task<IEnumerable<UnicastRoutingStrategy>> Route(Type messageType, IDistributionPolicy distributionPolicy, ContextBag contextBag)
 {
     IEnumerable<UnicastRoutingStrategy> unicastRoutingStrategies = new List<UnicastRoutingStrategy>
     {
         new UnicastRoutingStrategy("Fake")
     };
     return Task.FromResult(unicastRoutingStrategies);
 }
コード例 #8
0
        public async Task<IEnumerable<UnicastRoutingStrategy>> Route(Type messageType, IDistributionPolicy distributionPolicy, ContextBag contextBag)
        {
            var typesToRoute = messageMetadataRegistry.GetMessageMetadata(messageType).MessageHierarchy;

            var subscribers = await GetSubscribers(contextBag, typesToRoute).ConfigureAwait(false);

            var selectedDestinations = SelectDestinationsForEachEndpoint(distributionPolicy, subscribers);

            return selectedDestinations.Select(destination => new UnicastRoutingStrategy(destination));
        }
コード例 #9
0
        public void When_strategy_configured_for_endpoint_should_use_configured_strategy()
        {
            var p = new DistributionPolicy();
            var configuredStrategy = new FakeDistributionStrategy("SomeEndpoint", DistributionStrategyScope.Send);
            p.SetDistributionStrategy(configuredStrategy);

            IDistributionPolicy policy = p;
            var result = policy.GetDistributionStrategy("SomeEndpoint", DistributionStrategyScope.Send);

            Assert.That(result, Is.EqualTo(configuredStrategy));
        }
コード例 #10
0
        public void When_multiple_strategies_configured_endpoint_should_use_last_configured_strategy()
        {
            var p = new DistributionPolicy();
            var strategy1 = new FakeDistributionStrategy("SomeEndpoint", DistributionStrategyScope.Send);
            var strategy2 = new FakeDistributionStrategy("SomeEndpoint", DistributionStrategyScope.Send);
            p.SetDistributionStrategy(strategy1);
            p.SetDistributionStrategy(strategy2);

            IDistributionPolicy policy = p;
            var result = policy.GetDistributionStrategy("SomeEndpoint", DistributionStrategyScope.Send);

            Assert.That(result, Is.EqualTo(strategy2));
        }
コード例 #11
0
 public UnicastSendRouter(
     bool isSendOnly,
     string receiveQueueName,
     string instanceSpecificQueue,
     IDistributionPolicy defaultDistributionPolicy,
     UnicastRoutingTable unicastRoutingTable,
     EndpointInstances endpointInstances,
     Func <EndpointInstance, string> transportAddressTranslation)
 {
     this.isSendOnly                  = isSendOnly;
     this.receiveQueueName            = receiveQueueName;
     this.instanceSpecificQueue       = instanceSpecificQueue;
     this.defaultDistributionPolicy   = defaultDistributionPolicy;
     this.unicastRoutingTable         = unicastRoutingTable;
     this.endpointInstances           = endpointInstances;
     this.transportAddressTranslation = transportAddressTranslation;
 }
コード例 #12
0
 public UnicastSendRouter(
     string baseInputQueueName,
     string endpointName,
     string instanceSpecificQueue,
     string distributorAddress,
     IDistributionPolicy defaultDistributionPolicy,
     UnicastRoutingTable unicastRoutingTable,
     EndpointInstances endpointInstances,
     Func <EndpointInstance, string> transportAddressTranslation)
 {
     this.endpointName                = baseInputQueueName ?? endpointName;
     this.instanceSpecificQueue       = instanceSpecificQueue;
     this.distributorAddress          = distributorAddress;
     this.defaultDistributionPolicy   = defaultDistributionPolicy;
     this.unicastRoutingTable         = unicastRoutingTable;
     this.endpointInstances           = endpointInstances;
     this.transportAddressTranslation = transportAddressTranslation;
 }
コード例 #13
0
        public UnicastRoutingStrategy Route(Type messageType, IDistributionPolicy distributionPolicy)
        {
            var route = unicastRoutingTable.GetRouteFor(messageType);
            if (route == null)
            {
                return null;
            }

            if (route.PhysicalAddress != null)
            {
                return new UnicastRoutingStrategy(route.PhysicalAddress);
            }

            if (route.Instance != null)
            {
                return new UnicastRoutingStrategy(transportAddressTranslation(route.Instance));
            }


            var instances = endpointInstances.FindInstances(route.Endpoint).Select(e => transportAddressTranslation(e)).ToArray();
            var selectedInstanceAddress = distributionPolicy.GetDistributionStrategy(route.Endpoint, DistributionStrategyScope.Send).SelectReceiver(instances);
            return new UnicastRoutingStrategy(selectedInstanceAddress);
        }
コード例 #14
0
 public DefaultEventDistributor(IDistributionPolicy distributionPolicy, Func <EndpointInstance, string> transportAddressTranslation)
 {
     this.distributionPolicy          = distributionPolicy;
     this.transportAddressTranslation = transportAddressTranslation;
 }
コード例 #15
0
 public UnicastRouteResolver(Func <EndpointInstance, string> transportAddressTranslation, EndpointInstances endpointInstances, IDistributionPolicy distributionPolicy)
 {
     this.transportAddressTranslation = transportAddressTranslation;
     this.endpointInstances           = endpointInstances;
     this.distributionPolicy          = distributionPolicy;
 }
コード例 #16
0
 static string InvokeDistributionStrategy(IDistributionPolicy policy, string endpointName, string[] instanceAddress)
 {
     return policy.GetDistributionStrategy(endpointName, DistributionStrategyScope.Send).SelectReceiver(instanceAddress);
 }
コード例 #17
0
 public SendRouter(EndpointInstances endpointInstances, IDistributionPolicy distributionPolicy)
 {
     this.endpointInstances  = endpointInstances;
     this.distributionPolicy = distributionPolicy;
 }
コード例 #18
0
    public Bridge(string leftName, string rightName, bool autoCreateQueues, string autoCreateQueuesIdentity, EndpointInstances endpointInstances, ISubscriptionStorage subscriptionStorage, IDistributionPolicy distributionPolicy, string poisonQueue, Action <TransportExtensions <TLeft> > leftCustomization, Action <TransportExtensions <TRight> > rightCustomization, int?maximumConcurrency)
    {
        this.endpointInstances   = endpointInstances;
        this.subscriptionStorage = subscriptionStorage;
        publishRouter            = new PublishRouter(subscriptionStorage, distributionPolicy);
        sendRouter  = new SendRouter(endpointInstances, distributionPolicy);
        replyRouter = new ReplyRouter();

        leftConfig = RawEndpointConfiguration.Create(leftName, (context, _) => Forward(context, rightStartable, rightSubscribeRouter), poisonQueue);
        var leftTransport = leftConfig.UseTransport <TLeft>();

        leftTransport.GetSettings().Set("errorQueue", poisonQueue);
        leftCustomization?.Invoke(leftTransport);
        if (autoCreateQueues)
        {
            leftConfig.AutoCreateQueue(autoCreateQueuesIdentity);
        }

        rightConfig = RawEndpointConfiguration.Create(rightName, (context, _) => Forward(context, leftStartable, leftSubscribeRouter), poisonQueue);
        var rightTransport = rightConfig.UseTransport <TRight>();

        rightTransport.GetSettings().Set("errorQueue", poisonQueue);
        rightCustomization?.Invoke(rightTransport);
        if (autoCreateQueues)
        {
            rightConfig.AutoCreateQueue(autoCreateQueuesIdentity);
        }

        if (maximumConcurrency.HasValue)
        {
            leftConfig.LimitMessageProcessingConcurrencyTo(1);
            rightConfig.LimitMessageProcessingConcurrencyTo(1);
        }
    }
コード例 #19
0
        List <(UnicastRoutingStrategy, string)> SelectDestinationsForEachEndpoint(IOutgoingPublishContext publishContext, IDistributionPolicy distributionPolicy, IEnumerable <Subscriber> subscribers)
        {
            //Make sure we are sending only one to each transport destination. Might happen when there are multiple routing information sources.
            var addresses = new Dictionary <string, UnicastRoutingStrategy>();
            Dictionary <string, List <string> > groups = null;
            var results = new List <(UnicastRoutingStrategy, string)>();

            foreach (var subscriber in subscribers)
            {
                if (subscriber.Endpoint == null)
                {
                    if (!addresses.ContainsKey(subscriber.TransportAddress))
                    {
                        var strategy = new UnicastRoutingStrategy(subscriber.TransportAddress);
                        addresses.Add(subscriber.TransportAddress, strategy);
                        results.Add((strategy, null));
                        logger.Warn($"Subscription {subscriber.TransportAddress} comes from NServiceBus endpoint older than V6. That endpoint needs to be upgraded to at least V6 and restarted in order to be migrated to the new transport.");
                    }

                    continue;
                }

                groups = groups ?? new Dictionary <string, List <string> >();

                if (groups.TryGetValue(subscriber.Endpoint, out var transportAddresses))
                {
                    transportAddresses.Add(subscriber.TransportAddress);
                }
                else
                {
                    groups[subscriber.Endpoint] = new List <string> {
                        subscriber.TransportAddress
                    };
                }
            }

            if (groups != null)
            {
                foreach (var group in groups)
                {
                    var instances           = group.Value.ToArray(); // could we avoid this?
                    var distributionContext = new DistributionContext(instances, publishContext.Message, publishContext.MessageId, publishContext.Headers, transportAddressTranslation, publishContext.Extensions);
                    var subscriber          = distributionPolicy.GetDistributionStrategy(group.Key, DistributionStrategyScope.Publish).SelectDestination(distributionContext);

                    if (!addresses.ContainsKey(subscriber))
                    {
                        var strategy = new UnicastRoutingStrategy(subscriber);
                        addresses.Add(subscriber, strategy);
                        results.Add((strategy, group.Key));
                    }
                }
            }

            return(results);
        }
コード例 #20
0
 static string InvokeDistributionStrategy(IDistributionPolicy policy, string endpointName, string[] instanceAddress)
 {
     return(policy.GetDistributionStrategy(endpointName, DistributionStrategyScope.Send).SelectReceiver(instanceAddress));
 }
コード例 #21
0
 static string InvokeDistributionStrategy(IDistributionPolicy policy, string endpointName, string[] instanceAddress)
 {
     return(policy.GetDistributionStrategy(endpointName, DistributionStrategyScope.Send).SelectDestination(new DistributionContext(instanceAddress, null, null, null, null, null)));
 }
コード例 #22
0
        public async Task <IEnumerable <UnicastRoutingStrategy> > Route(Type messageType, IDistributionPolicy distributionPolicy, ContextBag contextBag)
        {
            var typesToRoute = messageMetadataRegistry.GetMessageMetadata(messageType).MessageHierarchy;

            var subscribers = await GetSubscribers(contextBag, typesToRoute).ConfigureAwait(false);

            var selectedDestinations = SelectDestinationsForEachEndpoint(distributionPolicy, subscribers);

            return(selectedDestinations.Select(destination => new UnicastRoutingStrategy(destination)));
        }
コード例 #23
0
        Dictionary <string, UnicastRoutingStrategy> .ValueCollection SelectDestinationsForEachEndpoint(IOutgoingPublishContext publishContext, IDistributionPolicy distributionPolicy, IEnumerable <Subscriber> subscribers)
        {
            //Make sure we are sending only one to each transport destination. Might happen when there are multiple routing information sources.
            var addresses = new Dictionary <string, UnicastRoutingStrategy>();
            Dictionary <string, List <string> > groups = null;

            foreach (var subscriber in subscribers)
            {
                if (subscriber.Endpoint == null)
                {
                    if (!addresses.ContainsKey(subscriber.TransportAddress))
                    {
                        addresses.Add(subscriber.TransportAddress, new UnicastRoutingStrategy(subscriber.TransportAddress));
                    }

                    continue;
                }

                groups = groups ?? new Dictionary <string, List <string> >();

                if (groups.TryGetValue(subscriber.Endpoint, out var transportAddresses))
                {
                    transportAddresses.Add(subscriber.TransportAddress);
                }
                else
                {
                    groups[subscriber.Endpoint] = new List <string> {
                        subscriber.TransportAddress
                    };
                }
            }

            if (groups != null)
            {
                foreach (var group in groups)
                {
                    var instances           = group.Value.ToArray(); // could we avoid this?
                    var distributionContext = new DistributionContext(instances, publishContext.Message, publishContext.MessageId, publishContext.Headers, transportAddressTranslation, publishContext.Extensions);
                    var subscriber          = distributionPolicy.GetDistributionStrategy(group.Key, DistributionStrategyScope.Publish).SelectDestination(distributionContext);

                    if (!addresses.ContainsKey(subscriber))
                    {
                        addresses.Add(subscriber, new UnicastRoutingStrategy(subscriber));
                    }
                }
            }

            return(addresses.Values);
        }
コード例 #24
0
            public Task <IEnumerable <UnicastRoutingStrategy> > Route(Type messageType, IDistributionPolicy distributionPolicy, IOutgoingPublishContext publishContext)
            {
                IEnumerable <UnicastRoutingStrategy> unicastRoutingStrategies = new List <UnicastRoutingStrategy>
                {
                    new UnicastRoutingStrategy("Fake")
                };

                return(Task.FromResult(unicastRoutingStrategies));
            }
コード例 #25
0
        public async Task <IEnumerable <UnicastRoutingStrategy> > Route(Type messageType, IDistributionPolicy distributionPolicy, IOutgoingPublishContext publishContext)
        {
            var typesToRoute = messageMetadataRegistry.GetMessageMetadata(messageType).MessageHierarchy;

            var subscribers = await GetSubscribers(publishContext, typesToRoute, publishContext.CancellationToken).ConfigureAwait(false);

            var destinations = SelectDestinationsForEachEndpoint(publishContext, distributionPolicy, subscribers);

            WarnIfNoSubscribersFound(messageType, destinations.Count);

            return(destinations);
        }
コード例 #26
0
 public UnicastRoutingStrategy Route(Type messageType, IDistributionPolicy distributionPolicy)
 {
     return(FixedDestination);
 }
コード例 #27
0
 public UnicastRoutingStrategy Route(Type messageType, IDistributionPolicy distributionPolicy)
 {
     return FixedDestination;
 }
コード例 #28
0
 public PublishRouter(ISubscriptionStorage subscriptionStorage, IDistributionPolicy distributionPolicy)
 {
     this.subscriptionStorage = subscriptionStorage;
     this.distributionPolicy  = distributionPolicy;
 }