public virtual UnicastRoutingStrategy Route(IOutgoingSendContext context) { var state = context.Extensions.GetOrCreate <State>(); var route = SelectRoute(state, context); return(ResolveRoute(route, context)); }
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); }
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))); }
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)); }
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}"); } }
UnicastRoute RouteToAnyInstanceOfThisEndpoint(IOutgoingSendContext context) { return(IncomingMessageOriginatesFromDistributor(context) ? UnicastRoute.CreateFromPhysicalAddress(distributorAddress) : UnicastRoute.CreateFromEndpointName(endpointName)); }
bool IncomingMessageOriginatesFromDistributor(IOutgoingSendContext context) { IncomingMessage incomingMessage; return(distributorAddress != null && context.Extensions.TryGet(out incomingMessage) && incomingMessage.Headers.ContainsKey(LegacyDistributorHeaders.WorkerSessionId)); }
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(); }
/// <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); }