Exemplo n.º 1
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);
        }
Exemplo n.º 2
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);
        }
            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();
 }
Exemplo n.º 6
0
 /// <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);
        }