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); }
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)); }
/// <summary> /// Creates a <see cref="IOutgoingLogicalMessageContext" /> based on the current context. /// </summary> public static IOutgoingLogicalMessageContext CreateOutgoingLogicalMessageContext(this StageConnector <IOutgoingPublishContext, IOutgoingLogicalMessageContext> stageConnector, OutgoingLogicalMessage outgoingMessage, IReadOnlyCollection <RoutingStrategy> routingStrategies, IOutgoingPublishContext sourceContext) { Guard.AgainstNull(nameof(outgoingMessage), outgoingMessage); Guard.AgainstNull(nameof(routingStrategies), routingStrategies); Guard.AgainstNull(nameof(sourceContext), sourceContext); return(new OutgoingLogicalMessageContext( sourceContext.MessageId, sourceContext.Headers, outgoingMessage, routingStrategies, sourceContext)); }
/// <summary> /// Turns off the best practice enforcement for the given context. /// </summary> public static void DoNotEnforceBestPractices(this IOutgoingPublishContext context) { context.Extensions.SetDoNotEnforceBestPractices(); }
/// <summary> /// Turns off the best practice enforcement for the given context. /// </summary> public static void DoNotEnforceBestPractices(this IOutgoingPublishContext context) { Guard.AgainstNull(nameof(context), context); context.Extensions.SetDoNotEnforceBestPractices(); }
/// <summary> /// Creates a <see cref="IOutgoingLogicalMessageContext" /> based on the current context. /// </summary> public static IOutgoingLogicalMessageContext CreateOutgoingLogicalMessageContext(this StageConnector<IOutgoingPublishContext, IOutgoingLogicalMessageContext> stageConnector, OutgoingLogicalMessage outgoingMessage, IReadOnlyCollection<RoutingStrategy> routingStrategies, IOutgoingPublishContext sourceContext) { Guard.AgainstNull(nameof(outgoingMessage), outgoingMessage); Guard.AgainstNull(nameof(routingStrategies), routingStrategies); Guard.AgainstNull(nameof(sourceContext), sourceContext); return new OutgoingLogicalMessageContext( sourceContext.MessageId, sourceContext.Headers, outgoingMessage, routingStrategies, sourceContext); }