Ejemplo n.º 1
0
        public virtual UnicastRoutingStrategy Route(IOutgoingSendContext context)
        {
            var state = context.Extensions.GetOrCreate <State>();
            var route = SelectRoute(state, context);

            return(ResolveRoute(route, context));
        }
Ejemplo n.º 2
0
        UnicastRoute RouteUsingTable(IOutgoingSendContext context)
        {
            var route = unicastRoutingTable.GetRouteFor(context.Message.MessageType);

            if (route == null)
            {
                throw new Exception($"No destination specified for message: {context.Message.MessageType}");
            }
            return(route);
        }
Ejemplo n.º 3
0
        UnicastRoute RouteToSpecificInstance(IOutgoingSendContext context, string specificInstance)
        {
            var route = RouteUsingTable(context);

            if (route.Endpoint == null)
            {
                throw new Exception("Routing to a specific instance is only allowed if route is defined for a logical endpoint, not for an address or instance.");
            }
            return(UnicastRoute.CreateFromEndpointInstance(new EndpointInstance(route.Endpoint, specificInstance)));
        }
Ejemplo n.º 4
0
        UnicastRoutingStrategy ResolveRoute(UnicastRoute route, IOutgoingSendContext context)
        {
            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 distributionContext     = new DistributionContext(instances, context.Message, context.MessageId, context.Headers, transportAddressTranslation, context.Extensions);
            var selectedInstanceAddress = defaultDistributionPolicy.GetDistributionStrategy(route.Endpoint, DistributionStrategyScope.Send).SelectDestination(distributionContext);

            return(new UnicastRoutingStrategy(selectedInstanceAddress));
        }
Ejemplo n.º 5
0
        UnicastRoute SelectRoute(State state, IOutgoingSendContext context)
        {
            switch (state.Option)
            {
            case RouteOption.ExplicitDestination:
                return(UnicastRoute.CreateFromPhysicalAddress(state.ExplicitDestination));

            case RouteOption.RouteToThisInstance:
                return(RouteToThisInstance());

            case RouteOption.RouteToAnyInstanceOfThisEndpoint:
                return(RouteToAnyInstanceOfThisEndpoint(context));

            case RouteOption.RouteToSpecificInstance:
                return(RouteToSpecificInstance(context, state.SpecificInstance));

            case RouteOption.None:
                return(RouteUsingTable(context));

            default:
                throw new Exception($"Unsupported route option: {state.Option}");
            }
        }
Ejemplo n.º 6
0
 UnicastRoute RouteToAnyInstanceOfThisEndpoint(IOutgoingSendContext context)
 {
     return(IncomingMessageOriginatesFromDistributor(context)
         ? UnicastRoute.CreateFromPhysicalAddress(distributorAddress)
         : UnicastRoute.CreateFromEndpointName(endpointName));
 }
Ejemplo n.º 7
0
        bool IncomingMessageOriginatesFromDistributor(IOutgoingSendContext context)
        {
            IncomingMessage incomingMessage;

            return(distributorAddress != null && context.Extensions.TryGet(out incomingMessage) && incomingMessage.Headers.ContainsKey(LegacyDistributorHeaders.WorkerSessionId));
        }
Ejemplo n.º 8
0
 public override UnicastRoutingStrategy Route(IOutgoingSendContext context)
 {
     return(FixedDestination);
 }
        /// <summary>
        /// Creates a <see cref="IOutgoingLogicalMessageContext" /> based on the current context.
        /// </summary>
        public static IOutgoingLogicalMessageContext CreateOutgoingLogicalMessageContext(this StageConnector <IOutgoingSendContext, IOutgoingLogicalMessageContext> stageConnector, OutgoingLogicalMessage outgoingMessage, IReadOnlyCollection <RoutingStrategy> routingStrategies, IOutgoingSendContext 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 IOutgoingSendContext context)
 {
     context.Extensions.SetDoNotEnforceBestPractices();
 }
Ejemplo n.º 11
0
 /// <summary>
 /// Turns off the best practice enforcement for the given context.
 /// </summary>
 public static void DoNotEnforceBestPractices(this IOutgoingSendContext 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<IOutgoingSendContext, IOutgoingLogicalMessageContext> stageConnector, OutgoingLogicalMessage outgoingMessage, IReadOnlyCollection<RoutingStrategy> routingStrategies, IOutgoingSendContext 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);
        }