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)); }
public UnicastRouter(BlueprintBasedRouteGenerator routeGenerator, EndpointInstances endpointInstances, IDistributionPolicy distributionPolicy, Func <EndpointInstance, string> resolveTransportAddress) { this.routeGenerator = routeGenerator; this.endpointInstances = endpointInstances; this.distributionPolicy = distributionPolicy; this.resolveTransportAddress = resolveTransportAddress; }
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; }
public PublishRoutingConnector(UnicastSubscriberTable routingTable, EndpointInstances endpointInstances, IDistributionPolicy distributionPolicy, Func <EndpointInstance, string> resolveTransportAddress) { this.routingTable = routingTable; this.endpointInstances = endpointInstances; this.distributionPolicy = distributionPolicy; this.resolveTransportAddress = resolveTransportAddress; }
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); }
public TopicExchangeAddressManager(string topicExchangeName, EndpointInstances endpointInstances, Func <EndpointInstance, string> transportAddressTranslation, IDistributionPolicy distributionPolicy) { this.topicExchangeName = topicExchangeName; this.endpointInstances = endpointInstances; this.transportAddressTranslation = transportAddressTranslation; this.distributionPolicy = distributionPolicy; }
public Task<IEnumerable<UnicastRoutingStrategy>> Route(Type messageType, IDistributionPolicy distributionPolicy, ContextBag contextBag) { IEnumerable<UnicastRoutingStrategy> unicastRoutingStrategies = new List<UnicastRoutingStrategy> { new UnicastRoutingStrategy("Fake") }; return Task.FromResult(unicastRoutingStrategies); }
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)); }
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)); }
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)); }
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; }
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; }
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); }
public DefaultEventDistributor(IDistributionPolicy distributionPolicy, Func <EndpointInstance, string> transportAddressTranslation) { this.distributionPolicy = distributionPolicy; this.transportAddressTranslation = transportAddressTranslation; }
public UnicastRouteResolver(Func <EndpointInstance, string> transportAddressTranslation, EndpointInstances endpointInstances, IDistributionPolicy distributionPolicy) { this.transportAddressTranslation = transportAddressTranslation; this.endpointInstances = endpointInstances; this.distributionPolicy = distributionPolicy; }
static string InvokeDistributionStrategy(IDistributionPolicy policy, string endpointName, string[] instanceAddress) { return policy.GetDistributionStrategy(endpointName, DistributionStrategyScope.Send).SelectReceiver(instanceAddress); }
public SendRouter(EndpointInstances endpointInstances, IDistributionPolicy distributionPolicy) { this.endpointInstances = endpointInstances; this.distributionPolicy = distributionPolicy; }
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); } }
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); }
static string InvokeDistributionStrategy(IDistributionPolicy policy, string endpointName, string[] instanceAddress) { return(policy.GetDistributionStrategy(endpointName, DistributionStrategyScope.Send).SelectReceiver(instanceAddress)); }
static string InvokeDistributionStrategy(IDistributionPolicy policy, string endpointName, string[] instanceAddress) { return(policy.GetDistributionStrategy(endpointName, DistributionStrategyScope.Send).SelectDestination(new DistributionContext(instanceAddress, null, null, null, null, null))); }
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))); }
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); }
public Task <IEnumerable <UnicastRoutingStrategy> > Route(Type messageType, IDistributionPolicy distributionPolicy, IOutgoingPublishContext publishContext) { IEnumerable <UnicastRoutingStrategy> unicastRoutingStrategies = new List <UnicastRoutingStrategy> { new UnicastRoutingStrategy("Fake") }; return(Task.FromResult(unicastRoutingStrategies)); }
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); }
public UnicastRoutingStrategy Route(Type messageType, IDistributionPolicy distributionPolicy) { return(FixedDestination); }
public UnicastRoutingStrategy Route(Type messageType, IDistributionPolicy distributionPolicy) { return FixedDestination; }
public PublishRouter(ISubscriptionStorage subscriptionStorage, IDistributionPolicy distributionPolicy) { this.subscriptionStorage = subscriptionStorage; this.distributionPolicy = distributionPolicy; }